self.src_loc = tracer.get_src_loc()
return super().__call__(value)
+
class ResetInserter(_ControlInserter):
def _insert_control(self, fragment, domain, signals):
stmts = [s.eq(Const(s.reset, s.nbits)) for s in signals if not s.reset_less]
def _insert_control(self, fragment, domain, signals):
stmts = [s.eq(s) for s in signals]
fragment.add_statements(Switch(self.controls[domain], {0: stmts}, src_loc=self.src_loc))
+
+ def on_fragment(self, fragment):
+ new_fragment = super().on_fragment(fragment)
+ if isinstance(new_fragment, Instance) and new_fragment.type in ("$memrd", "$memwr"):
+ clk_port, clk_dir = new_fragment.named_ports["CLK"]
+ if isinstance(clk_port, ClockSignal) and clk_port.domain in self.controls:
+ en_port, en_dir = new_fragment.named_ports["EN"]
+ en_port = Mux(self.controls[clk_port.domain], en_port, Const(0, len(en_port)))
+ new_fragment.named_ports["EN"] = en_port, en_dir
+ return new_fragment
from ..hdl.cd import *
from ..hdl.ir import *
from ..hdl.xfrm import *
+from ..hdl.mem import *
from .tools import *
)
""")
+ def test_ce_read_port(self):
+ mem = Memory(width=8, depth=4)
+ f = CEInserter(self.c1)(mem.read_port(transparent=False)).elaborate(platform=None)
+ self.assertRepr(f.named_ports["EN"][0], """
+ (m (sig c1) (sig mem_r_en) (const 1'd0))
+ """)
+
+ def test_ce_write_port(self):
+ mem = Memory(width=8, depth=4)
+ f = CEInserter(self.c1)(mem.write_port()).elaborate(platform=None)
+ self.assertRepr(f.named_ports["EN"][0], """
+ (m (sig c1) (cat (repl (slice (sig mem_w_en) 0:1) 8)) (const 8'd0))
+ """)
+
class _MockElaboratable(Elaboratable):
def __init__(self):
class FHDLTestCase(unittest.TestCase):
def assertRepr(self, obj, repr_str):
- obj = Statement.wrap(obj)
+ if isinstance(obj, list):
+ obj = Statement.wrap(obj)
def prepare_repr(repr_str):
repr_str = re.sub(r"\s+", " ", repr_str)
repr_str = re.sub(r"\( (?=\()", "(", repr_str)