From 034eb04835bb7b6790e66bdddb9b1979d27a56b6 Mon Sep 17 00:00:00 2001 From: Michael Maloney Date: Sun, 7 Jul 2024 14:52:35 +0000 Subject: [PATCH] Get registers working. --- examples/hello.vir | 25 +++++++++++++++---------- src/verilog.rs | 9 +++------ 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/examples/hello.vir b/examples/hello.vir index 84e03f8..8bddbc3 100644 --- a/examples/hello.vir +++ b/examples/hello.vir @@ -1,19 +1,24 @@ pub mod Top { incoming clk : Clock; incoming reset : Word[1]; - outgoing out : Word[1]; + outgoing out : Word[3]; - out := reset; + out := buffer.out; - mod foo of Foo; - foo.in := reset; + reg counter : Word[3] on clk; + counter <= if reset { 0 } else { counter->add(1) }; + + mod buffer of Buffer; + buffer.clk := clk; + buffer.in := counter; } -mod Foo { - incoming in : Word[1]; - incoming out : Word[1]; +mod Buffer { + incoming clk : Clock; + incoming in : Word[3]; + outgoing out : Word[3]; - node tmp : Word[1]; - tmp := in; - out := tmp; + reg buffer : Word[3] on clk; + buffer <= in; + out := buffer; } diff --git a/src/verilog.rs b/src/verilog.rs index 3edf710..49420d8 100644 --- a/src/verilog.rs +++ b/src/verilog.rs @@ -111,12 +111,9 @@ impl<'a> Verilog<'a> { SimpleComponentKind::Reg => { let expr = self.db.moddef_typecheck_wire(moddef.clone(), component.clone().as_path())?; let typ = expr.typ(); - let width_str = make_width_str(self.db, typ); - let clk: String = todo!(); - //let clock_ssa = self.verilog_expr(clk)?; - let connect_ssa = self.verilog_expr(expr)?; - let width = if let Type::Word(n) = expr.typ() { n } else { panic!() }; - let max_bit = width - 1; + let clk = component_ast.clock.unwrap(); + let connect_ssa = self.verilog_expr(expr.clone())?; + let width_str = make_width_str(self.db, typ.clone()); writeln!(self.writer, " reg {width_str} {component};")?; writeln!(self.writer, " always @(posedge {clk}) begin")?; writeln!(self.writer, " {component} <= {connect_ssa};")?;