[PyCDE] Add `.reg(clk)` method to PyCDE `Value`s

Makes it really easy to register a value.
This commit is contained in:
John Demme 2021-08-02 19:57:57 -07:00
parent 9391645303
commit e76f3cf87a
2 changed files with 9 additions and 4 deletions

View File

@ -1,6 +1,6 @@
from typing import Type
import circt.support as support
import circt.dialects.hw as hw
from circt.dialects import hw, seq
import mlir.ir as ir
@ -52,6 +52,9 @@ class Value:
return Value(hw.StructExtractOp.create(self.value, attr))
raise AttributeError(f"'Value' object has no attribute '{attr}'")
def reg(self, clk, rst=None):
return seq.reg(self.value, clk, rst)
# PyCDE needs a custom version of this to support python classes.
def var_to_attribute(obj) -> ir.Attribute:

View File

@ -38,6 +38,7 @@ class Top:
@module
class ComplexPorts:
clk = Input(types.i1)
sel = Input(types.i2)
data_in = Input(dim(32, 3))
struct_data_in = Input(types.struct({"foo": types.i32}))
@ -49,7 +50,7 @@ class ComplexPorts:
@generator
def build(mod):
return {
'a': mod.data_in[0],
'a': mod.data_in[0].reg(mod.clk),
'b': mod.data_in[mod.sel],
'c': mod.struct_data_in.foo
}
@ -80,9 +81,10 @@ top.print()
sys = System([ComplexPorts])
sys.generate()
sys.print()
# CHECK: hw.module @pycde.Comple_Ports(%data_in: !hw.array<3xi32>, %sel: i2, %struct_data_in: !hw.struct<foo: i32>) -> (%a: i32, %b: i32, %c: i32) {
# CHECK: hw.module @pycde.Comple_Ports(%clk: i1, %data_in: !hw.array<3xi32>, %sel: i2, %struct_data_in: !hw.struct<foo: i32>) -> (%a: i32, %b: i32, %c: i32) {
# CHECK: %c0_i2 = hw.constant 0 : i2
# CHECK: [[REG0:%.+]] = hw.array_get %data_in[%c0_i2] : !hw.array<3xi32>
# CHECK: [[REGR:%.+]] = seq.compreg [[REG0]], %clk : i32
# CHECK: [[REG1:%.+]] = hw.array_get %data_in[%sel] : !hw.array<3xi32>
# CHECK: [[REG2:%.+]] = hw.struct_extract %struct_data_in["foo"] : !hw.struct<foo: i32>
# CHECK: hw.output [[REG0]], [[REG1]], [[REG2]] : i32, i32, i32
# CHECK: hw.output [[REGR]], [[REG1]], [[REG2]] : i32, i32, i32