From: Sebastien Bourdeauducq Date: Sun, 24 Jun 2012 17:13:49 +0000 (+0200) Subject: Move arithmetic actors to actorlib X-Git-Tag: 24jan2021_ls180~2099^2~884 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fd233d5b3c2e5157febd42bf5c7de4cc622d4cdc;p=litex.git Move arithmetic actors to actorlib --- diff --git a/examples/dataflow/dma.py b/examples/dataflow/dma.py index ffc4d979..6e8c8840 100644 --- a/examples/dataflow/dma.py +++ b/examples/dataflow/dma.py @@ -1,7 +1,7 @@ from random import Random -from migen.flow.ala import * from migen.flow.network import * +from migen.actorlib.ala import * from migen.actorlib import dma_wishbone, dma_asmi from migen.actorlib.sim import * from migen.bus import wishbone, asmibus diff --git a/examples/dataflow/fibonacci.py b/examples/dataflow/fibonacci.py index 709cfe49..e67728bb 100644 --- a/examples/dataflow/fibonacci.py +++ b/examples/dataflow/fibonacci.py @@ -1,6 +1,6 @@ -from migen.flow.ala import * from migen.flow.network import * from migen.flow import plumbing +from migen.actorlib.ala import * from migen.actorlib.sim import * from migen.sim.generic import Simulator from migen.sim.icarus import Runner diff --git a/migen/actorlib/ala.py b/migen/actorlib/ala.py new file mode 100644 index 00000000..99214182 --- /dev/null +++ b/migen/actorlib/ala.py @@ -0,0 +1,81 @@ +from migen.fhdl.structure import * +from migen.fhdl.structure import _Operator +from migen.flow.actor import * +from migen.corelogic.record import * +from migen.corelogic import divider + +class _SimpleBinary(CombinatorialActor): + def __init__(self, bv_op, bv_r=None): + self.bv_op = bv_op + if bv_r is None: + bv_r = self.__class__.get_result_bv(bv_op) + self.bv_r = bv_r + super().__init__( + ("operands", Sink, [("a", bv_op), ("b", bv_op)]), + ("result", Source, [("r", bv_r)])) + + def get_process_fragment(self): + return Fragment([ + self.token("result").r.eq(_Operator(self.op, + [self.token("operands").a, self.token("operands").b])) + ]) + +class Add(_SimpleBinary): + op = "+" + def get_result_bv(bv): + return BV(bv.width+1, bv.signed) + +class Sub(_SimpleBinary): + op = "-" + def get_result_bv(bv): + return BV(bv.width+1, bv.signed) + +class Mul(_SimpleBinary): + op = "*" + def get_result_bv(bv): + return BV(2*bv.width, bv.signed) + +class And(_SimpleBinary): + op = "&" + def get_result_bv(bv): + return bv + +class Xor(_SimpleBinary): + op = "^" + def get_result_bv(bv): + return bv + +class Or(_SimpleBinary): + op = "|" + def get_result_bv(bv): + return bv + +class LT(_SimpleBinary): + op = "<" + def get_result_bv(bv): + return BV(1) + +class LE(_SimpleBinary): + op = "<=" + def get_result_bv(bv): + return BV(1) + +class EQ(_SimpleBinary): + op = "==" + def get_result_bv(bv): + return BV(1) + +class NE(_SimpleBinary): + op = "!=" + def get_result_bv(bv): + return BV(1) + +class DivMod(SequentialActor): + def __init__(self, width): + self.div = divider.Divider(width) + super().__init__(width, + ("operands", Sink, [("dividend", self.div.dividend_i), ("divisor", self.div.divisor_i)]), + ("result", Source, [("quotient", self.div.quotient_o), ("remainder", self.div.remainder_o)])) + + def get_process_fragment(self): + return self.div.get_fragment() + Fragment([self.div.start_i.eq(self.trigger)]) diff --git a/migen/actorlib/composer.py b/migen/actorlib/composer.py new file mode 100644 index 00000000..683186d1 --- /dev/null +++ b/migen/actorlib/composer.py @@ -0,0 +1,64 @@ +from migen.flow.actor import * +from migen.flow.plumbing import * +from migen.flow.network import * +from migen.actorlib.ala import * + +def _create(a, b, actor_class): + assert id(a.dfg) == id(b.dfg) + dfg = a.dfg + + bva = a.actor_node.get_dict()["bv_r"] + bvb = b.actor_node.get_dict()["bv_r"] + bv_op = BV(max(bva.width, bvb.width), bva.signed and bvb.signed) + bv_r = actor_class.get_result_bv(bv_op) + + new_actor = ActorNode(actor_class, {"bv_op": bv_op, "bv_r": bv_r}) + dfg.add_connection(a.actor_node, new_actor, "result", "operands", sink_subr=["a"]) + dfg.add_connection(b.actor_node, new_actor, "result", "operands", sink_subr=["b"]) + + return ComposableSource(dfg, new_actor) + +class ComposableSource: + def __init__(self, dfg, actor_node): + self.dfg = dfg + if not isinstance(actor_node, ActorNode): + actor_node = ActorNode(actor_node) + self.actor_node = actor_node + + def __add__(self, other): + return _create(self, other, Add) + def __radd__(self, other): + return _create(other, self, Add) + def __sub__(self, other): + return _create(self, other, Sub) + def __rsub__(self, other): + return _create(other, self, Sub) + def __mul__(self, other): + return _create(self, other, Mul) + def __rmul__(self, other): + return _create(other, self, Mul) + def __and__(self, other): + return _create(self, other, And) + def __rand__(self, other): + return _create(other, self, And) + def __xor__(self, other): + return _create(self, other, Xor) + def __rxor__(self, other): + return _create(other, self, Xor) + def __or__(self, other): + return _create(self, other, Or) + def __ror__(self, other): + return _create(other, self, Or) + + def __lt__(self, other): + return _create(self, other, LT) + def __le__(self, other): + return _create(self, other, LE) + def __eq__(self, other): + return _create(self, other, EQ) + def __ne__(self, other): + return _create(self, other, NE) + def __gt__(self, other): + return _create(other, self, LT) + def __ge__(self, other): + return _create(other, self, LE) diff --git a/migen/flow/ala.py b/migen/flow/ala.py deleted file mode 100644 index 99214182..00000000 --- a/migen/flow/ala.py +++ /dev/null @@ -1,81 +0,0 @@ -from migen.fhdl.structure import * -from migen.fhdl.structure import _Operator -from migen.flow.actor import * -from migen.corelogic.record import * -from migen.corelogic import divider - -class _SimpleBinary(CombinatorialActor): - def __init__(self, bv_op, bv_r=None): - self.bv_op = bv_op - if bv_r is None: - bv_r = self.__class__.get_result_bv(bv_op) - self.bv_r = bv_r - super().__init__( - ("operands", Sink, [("a", bv_op), ("b", bv_op)]), - ("result", Source, [("r", bv_r)])) - - def get_process_fragment(self): - return Fragment([ - self.token("result").r.eq(_Operator(self.op, - [self.token("operands").a, self.token("operands").b])) - ]) - -class Add(_SimpleBinary): - op = "+" - def get_result_bv(bv): - return BV(bv.width+1, bv.signed) - -class Sub(_SimpleBinary): - op = "-" - def get_result_bv(bv): - return BV(bv.width+1, bv.signed) - -class Mul(_SimpleBinary): - op = "*" - def get_result_bv(bv): - return BV(2*bv.width, bv.signed) - -class And(_SimpleBinary): - op = "&" - def get_result_bv(bv): - return bv - -class Xor(_SimpleBinary): - op = "^" - def get_result_bv(bv): - return bv - -class Or(_SimpleBinary): - op = "|" - def get_result_bv(bv): - return bv - -class LT(_SimpleBinary): - op = "<" - def get_result_bv(bv): - return BV(1) - -class LE(_SimpleBinary): - op = "<=" - def get_result_bv(bv): - return BV(1) - -class EQ(_SimpleBinary): - op = "==" - def get_result_bv(bv): - return BV(1) - -class NE(_SimpleBinary): - op = "!=" - def get_result_bv(bv): - return BV(1) - -class DivMod(SequentialActor): - def __init__(self, width): - self.div = divider.Divider(width) - super().__init__(width, - ("operands", Sink, [("dividend", self.div.dividend_i), ("divisor", self.div.divisor_i)]), - ("result", Source, [("quotient", self.div.quotient_o), ("remainder", self.div.remainder_o)])) - - def get_process_fragment(self): - return self.div.get_fragment() + Fragment([self.div.start_i.eq(self.trigger)]) diff --git a/migen/flow/composer.py b/migen/flow/composer.py deleted file mode 100644 index 2c58c967..00000000 --- a/migen/flow/composer.py +++ /dev/null @@ -1,64 +0,0 @@ -from migen.flow.actor import * -from migen.flow.ala import * -from migen.flow.plumbing import * -from migen.flow.network import * - -def _create(a, b, actor_class): - assert id(a.dfg) == id(b.dfg) - dfg = a.dfg - - bva = a.actor_node.get_dict()["bv_r"] - bvb = b.actor_node.get_dict()["bv_r"] - bv_op = BV(max(bva.width, bvb.width), bva.signed and bvb.signed) - bv_r = actor_class.get_result_bv(bv_op) - - new_actor = ActorNode(actor_class, {"bv_op": bv_op, "bv_r": bv_r}) - dfg.add_connection(a.actor_node, new_actor, "result", "operands", sink_subr=["a"]) - dfg.add_connection(b.actor_node, new_actor, "result", "operands", sink_subr=["b"]) - - return ComposableSource(dfg, new_actor) - -class ComposableSource: - def __init__(self, dfg, actor_node): - self.dfg = dfg - if not isinstance(actor_node, ActorNode): - actor_node = ActorNode(actor_node) - self.actor_node = actor_node - - def __add__(self, other): - return _create(self, other, Add) - def __radd__(self, other): - return _create(other, self, Add) - def __sub__(self, other): - return _create(self, other, Sub) - def __rsub__(self, other): - return _create(other, self, Sub) - def __mul__(self, other): - return _create(self, other, Mul) - def __rmul__(self, other): - return _create(other, self, Mul) - def __and__(self, other): - return _create(self, other, And) - def __rand__(self, other): - return _create(other, self, And) - def __xor__(self, other): - return _create(self, other, Xor) - def __rxor__(self, other): - return _create(other, self, Xor) - def __or__(self, other): - return _create(self, other, Or) - def __ror__(self, other): - return _create(other, self, Or) - - def __lt__(self, other): - return _create(self, other, LT) - def __le__(self, other): - return _create(self, other, LE) - def __eq__(self, other): - return _create(self, other, EQ) - def __ne__(self, other): - return _create(self, other, NE) - def __gt__(self, other): - return _create(other, self, LT) - def __ge__(self, other): - return _create(other, self, LE)