72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
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(Actor):
|
|
def __init__(self, op, bv_op, bv_r):
|
|
self.op = op
|
|
self.operands = Record([('a', bv_op), ('b', bv_op)])
|
|
self.result = Record([('r', bv_r)])
|
|
Actor.__init__(self,
|
|
SchedulingModel(SchedulingModel.COMBINATORIAL),
|
|
self.operands, self.result)
|
|
|
|
def get_process_fragment(self):
|
|
return Fragment([
|
|
self.result.r.eq(_Operator(self.op, [self.operands.a, self.operands.b]))
|
|
])
|
|
|
|
class Add(_SimpleBinary):
|
|
def __init__(self, bv):
|
|
_SimpleBinary.__init__(self, '+', bv, BV(bv.width+1, bv.signed))
|
|
|
|
class Sub(_SimpleBinary):
|
|
def __init__(self, bv):
|
|
_SimpleBinary.__init__(self, '-', bv, BV(bv.width+1, bv.signed))
|
|
|
|
class Mul(_SimpleBinary):
|
|
def __init__(self, bv):
|
|
_SimpleBinary.__init__(self, '*', bv, BV(2*bv.width, bv.signed))
|
|
|
|
class And(_SimpleBinary):
|
|
def __init__(self, bv):
|
|
_SimpleBinary.__init__(self, '*', bv, bv)
|
|
|
|
class Xor(_SimpleBinary):
|
|
def __init__(self, bv):
|
|
_SimpleBinary.__init__(self, '^', bv, bv)
|
|
|
|
class Or(_SimpleBinary):
|
|
def __init__(self, bv):
|
|
_SimpleBinary.__init__(self, '|', bv, bv)
|
|
|
|
class LT(_SimpleBinary):
|
|
def __init__(self, bv):
|
|
_SimpleBinary.__init__(self, '<', bv, BV(1))
|
|
|
|
class LE(_SimpleBinary):
|
|
def __init__(self, bv):
|
|
_SimpleBinary.__init__(self, '<=', bv, BV(1))
|
|
|
|
class EQ(_SimpleBinary):
|
|
def __init__(self, bv):
|
|
_SimpleBinary.__init__(self, '==', bv, BV(1))
|
|
|
|
class NE(_SimpleBinary):
|
|
def __init__(self, bv):
|
|
_SimpleBinary.__init__(self, '!=', bv, BV(1))
|
|
|
|
class DivMod(Actor):
|
|
def __init__(self, width):
|
|
self.div = divider.Inst(width)
|
|
self.operands = Record([('dividend', self.div.dividend_i), ('divisor', self.div.divisor_i)])
|
|
self.result = Record([('quotient', self.div.quotient_o), ('remainder', self.div.remainder_o)])
|
|
Actor.__init__(self,
|
|
SchedulingModel(SchedulingModel.SEQUENTIAL, width),
|
|
self.operands, self.result)
|
|
|
|
def get_process_fragment(self):
|
|
return self.div.get_fragment() + Fragment([self.div.start_i.eq(self.trigger)])
|