Source code for hwtLib.examples.mem.reg

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
:note: everything in hwtLib.examples is just example
    and it is usually more elegant way to do this
"""

from hwt.code import If, Concat
from hwt.hdl.types.defs import BIT
from hwt.hwIOs.std import HwIOSignal, HwIOVectSignal
from hwt.hwIOs.utils import addClkRst, propagateClkRst
from hwt.hwModule import HwModule
from hwt.pyUtils.typingFuture import override


[docs] class DReg(HwModule): """ Basic d flip flop :attention: using this unit is pointless because HWToolkit can automatically generate such a register for any interface and datatype .. hwt-autodoc:: """ @override def hwDeclr(self): addClkRst(self) self.din = HwIOSignal() self.dout = HwIOSignal()._m() @override def hwImpl(self): internReg = self._reg("internReg", BIT, def_val=False) internReg(self.din) self.dout(internReg)
[docs] class DoubleDReg(HwModule): """ :attention: using DReg unit instance is pointless because it can be instantiated by _reg in this unit .. hwt-autodoc:: """ @override def hwDeclr(self): DReg.hwDeclr(self) self.reg0 = DReg() self.reg1 = DReg() @override def hwImpl(self): propagateClkRst(self) self.reg0.din(self.din) self.reg1.din(self.reg0.dout) self.dout(self.reg1.dout)
[docs] class AsyncResetReg(DReg): """ .. hwt-autodoc:: """ @override def hwImpl(self): internReg = self._sig("internReg", BIT, def_val=False) If(self.rst._isOn(), internReg(0), ).Elif(self.clk._onRisingEdge(), internReg(self.din), ) self.dout(internReg)
[docs] class DDR_Reg(HwModule): """ Double Data Rate register .. hwt-autodoc:: """ @override def hwDeclr(self): addClkRst(self) self.din = HwIOSignal(dtype=BIT) self.dout = HwIOVectSignal(2)._m() @override def hwImpl(self): din = self.din internReg = [self._sig("internReg", BIT, def_val=False) for _ in range(2)] If(self.clk._onRisingEdge(), internReg[0](din), ) If(self.clk._onFallingEdge(), internReg[1](din), ) self.dout(Concat(*internReg))
[docs] class OptimizedOutReg(DReg): """ .. hwt-autodoc:: """ @override def hwImpl(self): # add and conect register as it is in DReg DReg.hwImpl(self) # add an extra unconnected register which will be automatically removed self._reg("unconnected")
[docs] class RegWhereNextIsOnlyOutput(DReg): """ (This is an error example) """ @override def hwImpl(self): r = self._reg("r") # if clk._risingEdge(): # r = r._rtlNextSig # r._rtlNextSig = r self.dout(r._rtlNextSig)
[docs] class LatchReg(HwModule): """ .. hwt-autodoc:: """ @override def hwDeclr(self): self.din = HwIOSignal() self.dout = HwIOSignal()._m() self.en = HwIOSignal() @override def hwImpl(self): # dout is latched because write into it is conditional # and it is not sychronized by any clock If(self.en, self.dout(self.din) )
[docs] class DReg_asyncRst(HwModule): """ .. hwt-autodoc:: """ @override def hwDeclr(self): DReg.hwDeclr(self) @override def hwImpl(self): r = self._sig("r") # "r" has reset which is not dependent on on "clk" If(self.rst._isOn(), r(0) ).Elif(self.clk._onRisingEdge(), r(self.din) ) self.dout(r)
if __name__ == "__main__": from hwt.synth import to_rtl_str m = OptimizedOutReg() print(to_rtl_str(m))