#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from hwt.code import If
from hwt.hdl.types.bits import HBits
from hwt.hwIOs.std import HwIOSignal, HwIOVectSignal, HwIOClk
from hwt.hwIOs.utils import addClkRstn
from hwt.hwModule import HwModule
from hwt.pyUtils.typingFuture import override
[docs]
class SimpleIfStatement(HwModule):
"""
.. hwt-autodoc::
"""
@override
def hwDeclr(self):
self.a = HwIOSignal()
self.b = HwIOSignal()
self.c = HwIOSignal()
self.d = HwIOSignal()._m()
@override
def hwImpl(self):
If(self.a,
self.d(self.b),
).Elif(self.b,
self.d(self.c)
).Else(
self.d(0)
)
[docs]
class SimpleIfStatement2(HwModule):
"""
.. hwt-autodoc::
"""
@override
def hwDeclr(self):
addClkRstn(self)
self.a = HwIOSignal()
self.b = HwIOSignal()
self.c = HwIOSignal()
self.d = HwIOSignal()._m()
@override
def hwImpl(self):
r = self._reg("reg_d", def_val=0)
If(self.a,
If(self.b & self.c,
r(1),
).Else(
r(0)
)
)
self.d(r)
[docs]
class SimpleIfStatement2b(HwModule):
"""
.. hwt-autodoc::
"""
@override
def hwDeclr(self):
addClkRstn(self)
self.a = HwIOSignal()
self.b = HwIOSignal()
self.c = HwIOSignal()
self.d = HwIOSignal()._m()
@override
def hwImpl(self):
r = self._reg("reg_d", def_val=0)
If(self.a & self.b,
If(self.c,
r(1),
)
).Elif(self.c,
r(0)
)
self.d(r)
[docs]
class SimpleIfStatement2c(HwModule):
"""
.. hwt-autodoc::
"""
@override
def hwDeclr(self):
addClkRstn(self)
self.a = HwIOSignal()
self.b = HwIOSignal()
self.c = HwIOSignal()
self.d = HwIOVectSignal(2)._m()
@override
def hwImpl(self):
r = self._reg("reg_d", HBits(2), def_val=0)
If(self.a & self.b,
If(self.c,
r(0),
)
).Elif(self.c,
r(1)
).Else(
r(2)
)
self.d(r)
[docs]
class SimpleIfStatement3(SimpleIfStatement):
"""
.. hwt-autodoc::
"""
@override
def hwImpl(self):
If(self.a,
self.d(0),
).Elif(self.b,
self.d(0)
).Else(
self.d(0)
)
[docs]
class SimpleIfStatementMergable(HwModule):
"""
.. hwt-autodoc::
"""
@override
def hwDeclr(self):
self.a = HwIOSignal()
self.b = HwIOSignal()
self.c = HwIOSignal()._m()
self.d = HwIOSignal()._m()
@override
def hwImpl(self):
If(self.a,
self.d(self.b),
).Else(
self.d(0)
)
If(self.a,
self.c(self.b),
).Else(
self.c(0)
)
[docs]
class SimpleIfStatementMergable1(HwModule):
"""
.. hwt-autodoc::
"""
@override
def hwDeclr(self):
self.a = HwIOSignal()
self.b = HwIOSignal()
self.c = HwIOSignal()._m()
self.d = HwIOSignal()._m()
self.e = HwIOSignal()
@override
def hwImpl(self):
If(self.e,
If(self.a,
self.d(self.b),
),
If(self.a,
self.c(self.b),
)
)
[docs]
class SimpleIfStatementMergable2(HwModule):
"""
.. hwt-autodoc::
"""
@override
def hwDeclr(self):
self.a = HwIOSignal()
self.b = HwIOSignal()
self.c = HwIOSignal()
self.d = HwIOSignal()._m()
self.e = HwIOSignal()._m()
self.f = HwIOSignal()._m()
@override
def hwImpl(self):
If(self.a,
self.d(self.b),
# this two if statements will be merged together
If(self.b,
self.e(self.c)
),
If(self.b,
self.f(0)
)
).Else(
self.d(0)
)
[docs]
class SimpleIfStatementPartialOverride(HwModule):
"""
.. hwt-autodoc::
"""
@override
def hwDeclr(self):
self.a = HwIOSignal()
self.b = HwIOSignal()
self.c = HwIOSignal()._m()
@override
def hwImpl(self):
If(self.b,
self.c(1),
If(self.a,
self.c(self.b),
),
)
[docs]
class SimpleIfStatementPartialOverrideNopVal(HwModule):
"""
.. hwt-autodoc::
"""
@override
def hwDeclr(self):
self.clk = HwIOClk()
self.a = HwIOSignal()
self.b = HwIOSignal()
self.c = HwIOSignal()
self.e = HwIOSignal()._m()
@override
def hwImpl(self):
d = self._reg("d")
If(self.a,
If(self.b,
d(1),
),
If(self.c,
d(0),
),
)
self.e(d)
[docs]
class IfStatementPartiallyEnclosed(HwModule):
"""
.. hwt-autodoc::
"""
@override
def hwDeclr(self):
self.clk = HwIOClk()
self.a = HwIOSignal()._m()
self.b = HwIOSignal()._m()
self.c = HwIOSignal()
self.d = HwIOSignal()
@override
def hwImpl(self):
a = self._reg("a_reg")
b = self._reg("b_reg")
If(self.c,
a(1),
b(1),
).Elif(self.d,
a(0)
).Else(
a(1),
b(1),
)
self.a(a)
self.b(b)
if __name__ == "__main__":
from hwt.synth import to_rtl_str
m = SimpleIfStatementPartialOverrideNopVal()
print(to_rtl_str(m))