Compare commits
2 Commits
120a3c59f4
...
6317987ed6
Author | SHA1 | Date |
---|---|---|
NotAFile | 6317987ed6 | |
NotAFile | f93530fe30 |
|
@ -86,7 +86,7 @@ struct Context {
|
||||||
/// map callable name to callable
|
/// map callable name to callable
|
||||||
callables: BTreeMap<String, Callable>,
|
callables: BTreeMap<String, Callable>,
|
||||||
/// map signal name to Signal
|
/// map signal name to Signal
|
||||||
signals: BTreeMap<String, Signal>
|
signals: BTreeMap<String, Signal>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Context {
|
impl Context {
|
||||||
|
@ -95,8 +95,9 @@ impl Context {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn try_get_signal(&self, signame: &str) -> Result<&Signal, CompileError> {
|
fn try_get_signal(&self, signame: &str) -> Result<&Signal, CompileError> {
|
||||||
self.get_signal(signame)
|
self.get_signal(signame).ok_or_else(|| {
|
||||||
.ok_or(CompileError::new(CompileErrorKind::UndefinedReference(signame.to_owned())))
|
CompileError::new(CompileErrorKind::UndefinedReference(signame.to_owned()))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,25 +114,23 @@ fn lower_process_statement(
|
||||||
let next_sig;
|
let next_sig;
|
||||||
if let Some(sig) = pctx.next_sigs.get(assig.lhs) {
|
if let Some(sig) = pctx.next_sigs.get(assig.lhs) {
|
||||||
next_sig = sig.clone();
|
next_sig = sig.clone();
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
let next_gen_id = format!("${}$next", assig.lhs);
|
let next_gen_id = format!("${}$next", assig.lhs);
|
||||||
module.add_wire(rtlil::Wire::new(&next_gen_id, TODO_WIDTH, None));
|
module.add_wire(rtlil::Wire::new(&next_gen_id, TODO_WIDTH, None));
|
||||||
next_sig = rtlil::SigSpec::Wire(next_gen_id);
|
next_sig = rtlil::SigSpec::Wire(next_gen_id);
|
||||||
|
|
||||||
pctx.next_sigs.insert(assig.lhs.to_owned(), next_sig.clone());
|
pctx.next_sigs
|
||||||
|
.insert(assig.lhs.to_owned(), next_sig.clone());
|
||||||
|
|
||||||
// trigger the modified value to update
|
// trigger the modified value to update
|
||||||
pctx.updates.push((
|
pctx.updates
|
||||||
ctx.try_get_signal(assig.lhs)?.sigspec(),
|
.push((ctx.try_get_signal(assig.lhs)?.sigspec(), next_sig.clone()));
|
||||||
next_sig.clone(),
|
|
||||||
));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let next_expr_wire = lower_expression(ctx, module, &assig.expr)?;
|
let next_expr_wire = lower_expression(ctx, module, &assig.expr)?;
|
||||||
|
|
||||||
rtlil::CaseRule {
|
rtlil::CaseRule {
|
||||||
assign: vec![(next_sig.clone(), next_expr_wire)],
|
assign: vec![(next_sig, next_expr_wire)],
|
||||||
switches: vec![],
|
switches: vec![],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -198,15 +197,15 @@ fn desugar_operation<'a>(op: parser::Operation<'a>) -> parser::Call<'a> {
|
||||||
let b = desugar_expression(b);
|
let b = desugar_expression(b);
|
||||||
parser::Call {
|
parser::Call {
|
||||||
name: "and".into(),
|
name: "and".into(),
|
||||||
args: vec![a, b]
|
args: vec![a, b],
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
parser::Operation::Or { a, b } => {
|
parser::Operation::Or { a, b } => {
|
||||||
let a = desugar_expression(a);
|
let a = desugar_expression(a);
|
||||||
let b = desugar_expression(b);
|
let b = desugar_expression(b);
|
||||||
parser::Call {
|
parser::Call {
|
||||||
name: "or".into(),
|
name: "or".into(),
|
||||||
args: vec![a, b]
|
args: vec![a, b],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
parser::Operation::Xor { a, b } => {
|
parser::Operation::Xor { a, b } => {
|
||||||
|
@ -214,14 +213,14 @@ fn desugar_operation<'a>(op: parser::Operation<'a>) -> parser::Call<'a> {
|
||||||
let b = desugar_expression(b);
|
let b = desugar_expression(b);
|
||||||
parser::Call {
|
parser::Call {
|
||||||
name: "xor".into(),
|
name: "xor".into(),
|
||||||
args: vec![a, b]
|
args: vec![a, b],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
parser::Operation::Not(a) => {
|
parser::Operation::Not(a) => {
|
||||||
let a = desugar_expression(a);
|
let a = desugar_expression(a);
|
||||||
parser::Call {
|
parser::Call {
|
||||||
name: "not".into(),
|
name: "not".into(),
|
||||||
args: vec![a]
|
args: vec![a],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -233,13 +232,13 @@ fn desugar_expression<'a>(expr: parser::Expression<'a>) -> parser::Expression<'a
|
||||||
parser::Expression::Ident(_) => expr,
|
parser::Expression::Ident(_) => expr,
|
||||||
parser::Expression::Literal(_) => expr,
|
parser::Expression::Literal(_) => expr,
|
||||||
parser::Expression::Call(mut call) => {
|
parser::Expression::Call(mut call) => {
|
||||||
let new_args = call.args.into_iter().map(|argex| desugar_expression(argex)).collect();
|
let new_args = call.args.into_iter().map(desugar_expression).collect();
|
||||||
call.args = new_args;
|
call.args = new_args;
|
||||||
parser::Expression::Call(call)
|
parser::Expression::Call(call)
|
||||||
},
|
}
|
||||||
parser::Expression::Operation(op) => {
|
parser::Expression::Operation(op) => {
|
||||||
parser::Expression::Call(Box::new(desugar_operation(*op)))
|
parser::Expression::Call(Box::new(desugar_operation(*op)))
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,7 +252,7 @@ fn lower_expression(
|
||||||
parser::Expression::Ident(ident) => {
|
parser::Expression::Ident(ident) => {
|
||||||
let signal = ctx.try_get_signal(ident)?;
|
let signal = ctx.try_get_signal(ident)?;
|
||||||
Ok(signal.sigspec())
|
Ok(signal.sigspec())
|
||||||
},
|
}
|
||||||
parser::Expression::Call(call) => {
|
parser::Expression::Call(call) => {
|
||||||
let args_resolved = call
|
let args_resolved = call
|
||||||
.args
|
.args
|
||||||
|
@ -321,9 +320,12 @@ pub fn lower_module(pa_module: parser::Module) -> Result<String, CompileError> {
|
||||||
let sig = Signal {
|
let sig = Signal {
|
||||||
name: port.net.name.to_owned(),
|
name: port.net.name.to_owned(),
|
||||||
il_id: make_pubid(port.net.name),
|
il_id: make_pubid(port.net.name),
|
||||||
typ: Type::Wire(GenericParam::Solved(port.net.width.unwrap_or(1) as u32))
|
typ: Type::Wire(GenericParam::Solved(port.net.width.unwrap_or(1) as u32)),
|
||||||
};
|
};
|
||||||
let sig = context.signals.entry(port.net.name.to_owned()).or_insert(sig);
|
let sig = context
|
||||||
|
.signals
|
||||||
|
.entry(port.net.name.to_owned())
|
||||||
|
.or_insert(sig);
|
||||||
|
|
||||||
let dir_option = match port.direction {
|
let dir_option = match port.direction {
|
||||||
parser::PortDirection::Input => rtlil::PortOption::Input(idx as i32 + 1),
|
parser::PortDirection::Input => rtlil::PortOption::Input(idx as i32 + 1),
|
||||||
|
|
|
@ -47,9 +47,11 @@ fn main() {
|
||||||
let lowered = crate::frontend::lower_module(res.1);
|
let lowered = crate::frontend::lower_module(res.1);
|
||||||
match lowered {
|
match lowered {
|
||||||
Ok(res) => {
|
Ok(res) => {
|
||||||
let mut file = File::create(opt.output.unwrap_or("out.rtlil".into())).expect("could not open file");
|
let mut file = File::create(opt.output.unwrap_or_else(|| "out.rtlil".into()))
|
||||||
file.write_all(res.as_bytes()).expect("failed to write output file");
|
.expect("could not open file");
|
||||||
},
|
file.write_all(res.as_bytes())
|
||||||
|
.expect("failed to write output file");
|
||||||
|
}
|
||||||
Err(err) => eprintln!("{:#?}", err),
|
Err(err) => eprintln!("{:#?}", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue