Defining a RTL Part
Defining a register is as simple as defining a Python class with ports and behavior.
from ml.engine import Part, Port
from ml.strategies import all_updated
from me.domains.hardware.digital import Logic, rising_edge
class Register(Part):
def __init__(self, identifier: str):
ports = [
Port('clk', Port.IN, type=Logic, init_value=Logic.U, semantic=Port.PERSISTENT),
Port('rst', Port.IN, type=Logic, init_value=Logic.U, semantic=Port.PERSISTENT),
Port('in_0', Port.IN, type=Logic, init_value=Logic.U, semantic=Port.PERSISTENT),
Port('out_0', Port.OUT, type=Logic, init_value=Logic.U, semantic=Port.PERSISTENT)
]
super().__init__(identifier=identifier, ports=ports, scheduling_condition=all_updated, scheduling_args=('clk',))
@rising_edge('clk')
def behavior(self):
if self.read('rst') == Logic.ONE:
self.write('out_0', Logic.ZERO)
else:
self.write('out_0', self.read('in_0'))