New migen.fhdl.std to simplify imports + len->flen
authorSebastien Bourdeauducq <sebastien@milkymist.org>
Wed, 22 May 2013 15:11:09 +0000 (17:11 +0200)
committerSebastien Bourdeauducq <sebastien@milkymist.org>
Wed, 22 May 2013 15:11:09 +0000 (17:11 +0200)
61 files changed:
examples/basic/arrays.py
examples/basic/complex.py
examples/basic/fsm.py
examples/basic/graycounter.py
examples/basic/local_cd.py
examples/basic/memory.py
examples/basic/namer.py
examples/basic/psync.py
examples/basic/record.py
examples/basic/simple_gpio.py
examples/basic/tristate.py
examples/basic/two_dividers.py
examples/dataflow/dma.py
examples/pytholite/uio.py
examples/sim/abstract_transactions.py
examples/sim/basic1.py
examples/sim/basic2.py
examples/sim/dataflow.py
examples/sim/fir.py
examples/sim/memory.py
migen/actorlib/dma_asmi.py
migen/actorlib/dma_wishbone.py
migen/actorlib/misc.py
migen/actorlib/sim.py
migen/actorlib/spi.py
migen/actorlib/structuring.py
migen/bank/csrgen.py
migen/bank/description.py
migen/bank/eventmanager.py
migen/bus/asmibus.py
migen/bus/csr.py
migen/bus/dfi.py
migen/bus/memory.py
migen/bus/transactions.py
migen/bus/wishbone.py
migen/bus/wishbone2asmi.py
migen/bus/wishbone2csr.py
migen/fhdl/size.py [new file with mode: 0644]
migen/fhdl/specials.py
migen/fhdl/std.py [new file with mode: 0644]
migen/fhdl/structure.py
migen/fhdl/tools.py
migen/fhdl/verilog.py
migen/flow/actor.py
migen/flow/hooks.py
migen/flow/isd.py
migen/flow/network.py
migen/flow/plumbing.py
migen/genlib/buffers.py
migen/genlib/cdc.py
migen/genlib/complex.py
migen/genlib/divider.py
migen/genlib/fifo.py
migen/genlib/fsm.py
migen/genlib/ioo.py
migen/genlib/misc.py
migen/genlib/record.py
migen/genlib/roundrobin.py
migen/pytholite/io.py
migen/pytholite/reg.py
migen/sim/generic.py

index 7792dc9115de3f161c9e3e70807dff8dd7713e6e..2822e197f0071c19142aa87e5f50e0102593ac68 100644 (file)
@@ -1,6 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.specials import Instance
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.fhdl import verilog
 
 class Example(Module):
index d632fe4424a262bcf3390e5938ae972e40bd00e3..f5777103e30aa266129c34a4f97dd03f0a5ae865 100644 (file)
@@ -1,4 +1,4 @@
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.genlib.complex import *
 from migen.fhdl import verilog
 
index 5dfc4f76dfe37d2a3194bdec5990510b9907f7d3..eb7e03aee7a49b8110c39e5f4adc63edfcf7b407 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.fhdl import verilog
 from migen.genlib.fsm import FSM
 
index f623fbf786d87ff7c7488ad24683afae9f46d2f5..3a543e5f4f60cfc9d6f991e9d9554431b7ab8686 100644 (file)
@@ -1,6 +1,6 @@
 from random import Random
 
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.genlib.cdc import GrayCounter
 from migen.sim.generic import Simulator
 
index bebd920edf99d81de91f7aa0aba2becc1bdef72e..ca7dd8422aebbaeb78c782ad02c9ed0bcf7cb38c 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.fhdl import verilog
 from migen.genlib.divider import Divider
 
index d3c8f7712c5903755b6b417b4c03fd65c36d1be0..19e011abd149469970858633597cba158922a33b 100644 (file)
@@ -1,6 +1,4 @@
-from migen.fhdl.structure import Fragment
-from migen.fhdl.specials import Memory
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.fhdl import verilog
 
 class Example(Module):
index eb6c5ee2e56634c1296319ec5c75f95695b60d10..e722dcb4619e8c4e62003fd4576f0deda77ad392 100644 (file)
@@ -1,6 +1,5 @@
-from migen.fhdl.structure import *
+from migen.fhdl.std import *
 from migen.fhdl import verilog
-from migen.fhdl.module import Module
 from migen.genlib.misc import optree
 
 def gen_list(n):
index 59422d5ef60879bb6d0965bacd7ffa94c2b567f1..8bbb3f45d5c48fd8a85a3848efbf0e28fa6eeda7 100644 (file)
@@ -1,4 +1,4 @@
-from migen.fhdl.structure import *
+from migen.fhdl.std import *
 from migen.fhdl.specials import SynthesisDirective
 from migen.fhdl import verilog
 from migen.genlib.cdc import *
index dd7a905b3a22d0673100ce524ba95699ec105776..aec89c64c2c065a70d466950ac3eefa4ed1ee809 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.fhdl import verilog
 from migen.genlib.record import *
 
index cb8a3a8f2eacf87ed847d560322a04f1dafc7e14..ab2502ee86a28760d4250f41ab7a907f7ff9cf51 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.fhdl import verilog
 from migen.genlib.cdc import MultiReg
 from migen.bank import description, csrgen
index b9c867d3d96ff5a6c64a3ce6728f9377eead4ccc..47696fd303df5291cc1e132d9d1734b3c78dfb21 100644 (file)
@@ -1,16 +1,11 @@
-from migen.fhdl.structure import *
-from migen.fhdl.specials import Tristate
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.fhdl import verilog
 
 class Example(Module):
        def __init__(self, n=6):
                self.pad = Signal(n)
-               self.o = Signal(n)
-               self.oe = Signal()
-               self.i = Signal(n)
-
-               self.specials += Tristate(self.pad, self.o, self.oe, self.i)
+               self.t = TSTriple(n)
+               self.specials += self.t.get_tristate(self.pad)
 
 e = Example()
-print(verilog.convert(e, ios={e.pad, e.o, e.oe, e.i}))
+print(verilog.convert(e, ios={e.pad, e.t.o, e.t.oe, e.t.i}))
index b474fa341b81343a8fc3f607375498699211289c..98759419cbffe9c914367e7bdd50e3c7c58ac273 100644 (file)
@@ -1,5 +1,5 @@
+from migen.fhdl.std import *
 from migen.fhdl import verilog
-from migen.fhdl.module import Module
 from migen.genlib import divider
 
 class Example(Module):
index c46ee4a623cdaf914db956c8eec3acea88fd290a..9ae85ab47e92e54aecf4dd0369dd500c2f1a6cb3 100644 (file)
@@ -1,6 +1,6 @@
 from random import Random
 
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.flow.network import *
 from migen.flow.transactions import *
 from migen.actorlib import dma_wishbone, dma_asmi
index edf26af0fb578a85726253fad1b670600bc4bccd..c627a8efde1b4fdd400bd03c77d12b11507eb5cd 100644 (file)
@@ -7,8 +7,7 @@ from migen.genlib.ioo import UnifiedIOSimulation
 from migen.pytholite.transel import Register
 from migen.pytholite.compiler import Pytholite
 from migen.sim.generic import Simulator
-from migen.fhdl.module import Module
-from migen.fhdl.specials import Memory
+from migen.fhdl.std import *
 from migen.fhdl import verilog
 
 layout = [("r", 32)]
index bb69169d7789f2569010e41540f89ff6bc356d49..0922d04aae75b851fa423a3c6a78a8034659a0f7 100644 (file)
@@ -1,10 +1,6 @@
-# Copyright (C) 2012 Vermeer Manufacturing Co.
-# License: GPLv3 with additional permissions (see README).
-
 from random import Random
 
-from migen.fhdl.structure import *
-from migen.fhdl import autofragment
+from migen.fhdl.std import *
 from migen.bus.transactions import *
 from migen.bus import wishbone, asmibus
 from migen.sim.generic import Simulator
index 8cf4b4c2e9fe6e1f4c365526796229353fb6d643..6890b1704bbd1b4d816cccd896922e682ef1212e 100644 (file)
@@ -1,7 +1,7 @@
 # Copyright (C) 2012 Vermeer Manufacturing Co.
 # License: GPLv3 with additional permissions (see README).
 
-from migen.fhdl.structure import *
+from migen.fhdl.std import *
 from migen.sim.generic import Simulator
 
 # Our simple counter, which increments at every cycle
index 78fd2eeb95dd9eac20b785f95480d3f278152cb0..3b9aa7f2c3c725df5614db27ff4637ad01c28480 100644 (file)
@@ -1,7 +1,7 @@
 # Copyright (C) 2012 Vermeer Manufacturing Co.
 # License: GPLv3 with additional permissions (see README).
 
-from migen.fhdl.structure import *
+from migen.fhdl.std import *
 from migen.sim.generic import Simulator, TopLevel
 
 # A slightly improved counter.
index 4c02b24fd9b04d4b6ff207cef9d110c2cea3d570..ca142344b5fefed2ef065b8107ee60cdd79f8e2f 100644 (file)
@@ -1,4 +1,4 @@
-from migen.fhdl.structure import *
+from migen.fhdl.std import *
 from migen.flow.actor import *
 from migen.flow.transactions import *
 from migen.flow.network import *
index edce5a070165a8d6adc2dea1a09d0542152046d3..0f939403f2d18f022050eb41f5548f89e4e9dd37 100644 (file)
@@ -5,8 +5,7 @@ from math import cos, pi
 from scipy import signal
 import matplotlib.pyplot as plt
 
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.fhdl import verilog
 from migen.genlib.misc import optree
 from migen.sim.generic import Simulator
index 4433017907aee9a7125a91d553f210945fe96f25..45341d7ebb2c73c2a159aa7e6fcdc1c6ca4a0c0f 100644 (file)
@@ -1,8 +1,7 @@
 # Copyright (C) 2012 Vermeer Manufacturing Co.
 # License: GPLv3 with additional permissions (see README).
 
-from migen.fhdl.structure import *
-from migen.fhdl.specials import Memory
+from migen.fhdl.std import *
 from migen.sim.generic import Simulator
 
 class Mem:
index 0220433ab2d79449430fb1465b8a709a166172d6..142b2a10a01b4f258105577064cff7e32013827d 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.flow.actor import *
 from migen.genlib.buffers import ReorderBuffer
 
@@ -49,7 +48,7 @@ class OOOReader(Module):
        
                ###
 
-               tag_width = len(port.tag_call)
+               tag_width = flen(port.tag_call)
                data_width = port.hub.dw
                depth = len(port.slots)
                rob = ReorderBuffer(tag_width, data_width, depth)
index c3551a3b35813e52ac8c95feb91d1885c3f14c55..c86dd840a312396772a326d91280f89a943eef2b 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.bus import wishbone
 from migen.flow.actor import *
 
index f1d95acb62607b60a1dd2f1d9fec3be81565b3be..b99ad2e589094551bb9df0ca2f4c937e812f4907 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.genlib.record import *
 from migen.genlib.fsm import *
 from migen.flow.actor import *
index 8c6463b451de1487858c2dd2008c704bbe9df6e8..ac80a2f00471e02f760b49a5a84ca7cccd162b06 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.flow.actor import *
 from migen.flow.transactions import *
 
index 38c5177248fca3738f88ec0d5aaf3b3c95825b3a..0f3a577e0b90df0ccd228452995935c6a42a5228 100644 (file)
@@ -1,7 +1,6 @@
 # Simple Processor Interface
 
-from migen.fhdl.structure import *
-from migen.fhdl.specials import Memory
+from migen.fhdl.std import *
 from migen.bank.description import *
 from migen.flow.actor import *
 from migen.flow.network import *
@@ -130,8 +129,8 @@ class _DMAController(Module):
 
 class DMAReadController(_DMAController):
        def __init__(self, bus_accessor, *args, **kwargs):
-               bus_aw = len(bus_accessor.address.payload.a)
-               bus_dw = len(bus_accessor.data.payload.d)
+               bus_aw = flen(bus_accessor.address.payload.a)
+               bus_dw = flen(bus_accessor.data.payload.d)
                _DMAController.__init__(self, bus_accessor, bus_aw, bus_dw, *args, **kwargs)
                
                g = DataFlowGraph()
index dd917bbc26de8790b5106813bf75512c7d9c508b..e671fed05705dac6378fdf4a512ecc5d6ca352b6 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.flow.actor import *
 
 def _rawbits_layout(l):
@@ -22,7 +21,7 @@ class Cast(CombinatorialActor):
                sigs_to = self.source.payload.flatten()
                if reverse_to:
                        sigs_to = list(reversed(sigs_to))
-               if sum(len(s) for s in sigs_from) != sum(len(s) for s in sigs_to):
+               if sum(flen(s) for s in sigs_from) != sum(flen(s) for s in sigs_to):
                        raise TypeError
                self.comb += Cat(*sigs_to).eq(Cat(*sigs_from))
 
index 01e4bf0fe8d66ef018fcad57e73536dbe1d65092..836a499e06c71f8f993c3233e5a77c92fe306bb2 100644 (file)
@@ -1,7 +1,6 @@
 from operator import itemgetter
 
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.bus import csr
 from migen.bank.description import *
 
index 92dcdcd26386f253a6e25374bd4a7470c55d45c9..d4141ebd084c789735623c90750ce2a6334fa858 100644 (file)
@@ -1,6 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.specials import Memory
-from migen.fhdl.module import *
+from migen.fhdl.std import *
 from migen.fhdl.tracer import get_obj_var_name
 
 class _CSRBase(HUID):
index 85e4476bf40827d27124ae6cbc3a68521a656185..9c9aa423a9351eb39e3f29815d57afae1521751b 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.bank.description import *
 from migen.genlib.misc import optree
 
index 535acc32cf75abd553eec0f5a37e80ff38e17728..e1141e9807e4bd4d81ae8f83e3a17c7791e73262 100644 (file)
@@ -1,5 +1,5 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module, FinalizeError
+from migen.fhdl.std import *
+from migen.fhdl.module import FinalizeError
 from migen.genlib.misc import optree
 from migen.genlib import roundrobin
 from migen.bus.transactions import *
index 1c3c3bd468b872876fe05a97878781556652170c..dc51f7e5ed50945da229c70241486e354e687f58 100644 (file)
@@ -1,6 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.specials import Memory
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.bus.transactions import *
 from migen.bank.description import CSRStorage
 from migen.genlib.record import *
@@ -115,10 +113,10 @@ class SRAM(Module):
                                ]
                
                if self._page is None:
-                       self.comb += port.adr.eq(self.bus.adr[word_bits:len(port.adr)])
+                       self.comb += port.adr.eq(self.bus.adr[word_bits:flen(port.adr)])
                else:
                        pv = self._page.storage
-                       self.comb += port.adr.eq(Cat(self.bus.adr[word_bits:len(port.adr)-len(pv)], pv))
+                       self.comb += port.adr.eq(Cat(self.bus.adr[word_bits:flen(port.adr)-flen(pv)], pv))
 
        def get_csrs(self):
                if self._page is None:
index d8c2f90fef6d350cd6f2c5091bfe5ebfea414a1a..42425b1b455711b86a0b66b2e3d8cdd40ee6cd73 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.genlib.record import *
 
 def phase_description(a, ba, d):
index c99f0e725a397c777d23056600e7e74dc6b48dc3..77aeaedbf1b53e4db16f205170d8755b976c9966 100644 (file)
@@ -1,4 +1,4 @@
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.bus.transactions import *
 
 def _byte_mask(orig, dat_w, sel):
index a3dd484052624be1b5e6fd731a6dcbcc07318aee..b3fc1cbf52bac0c0123e5cd1c8fbca7d600bf576 100644 (file)
@@ -1,4 +1,4 @@
-from migen.fhdl.structure import bits_for
+from migen.fhdl.std import *
 
 class Transaction:
        def __init__(self, address, data=0, sel=None, busname=None):
index 5df37a9235899720de896f8209ff219781f2216e..a2550c42ae41953568dd1fb38a7b52f90fbb7795 100644 (file)
@@ -1,6 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.specials import Memory
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.genlib import roundrobin
 from migen.genlib.record import *
 from migen.genlib.misc import optree
@@ -91,7 +89,7 @@ class Decoder(Module):
                ]
                
                # mux (1-hot) slave data return
-               masked = [Replicate(slave_sel_r[i], len(master.dat_r)) & slaves[i][1].dat_r for i in range(ns)]
+               masked = [Replicate(slave_sel_r[i], flen(master.dat_r)) & slaves[i][1].dat_r for i in range(ns)]
                self.comb += master.dat_r.eq(optree("|", masked))
 
 class InterconnectShared(Module):
@@ -210,7 +208,7 @@ class SRAM(Module):
                                for i in range(4)]
                # address and data
                self.comb += [
-                       port.adr.eq(self.bus.adr[:len(port.adr)]),
+                       port.adr.eq(self.bus.adr[:flen(port.adr)]),
                        self.bus.dat_r.eq(port.dat_r)
                ]
                if not read_only:
index 45882078883dc91b15fda57a3526f2962167be8d..94f86192c3096923425fa575b02d8fdb1d25ddfd 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.specials import Memory
+from migen.fhdl.std import *
 from migen.bus import wishbone
 from migen.genlib.fsm import FSM
 from migen.genlib.misc import split, displacer, chooser
index 5e62de847bdb4e96a82edddbe723e69d792c14f3..5b8037870860a6255d80937e1264733cb017ff52 100644 (file)
@@ -1,23 +1,23 @@
+from migen.fhdl.std import *
 from migen.bus import wishbone
 from migen.bus import csr
-from migen.fhdl.structure import *
 from migen.genlib.misc import timeline
 
-class WB2CSR:
+class WB2CSR(Module):
        def __init__(self):
                self.wishbone = wishbone.Interface()
                self.csr = csr.Interface()
        
-       def get_fragment(self):
-               sync = [
+               ###
+
+               self.sync += [
                        self.csr.we.eq(0),
                        self.csr.dat_w.eq(self.wishbone.dat_w[:csr.data_width]),
                        self.csr.adr.eq(self.wishbone.adr[:14]),
                        self.wishbone.dat_r.eq(self.csr.dat_r)
                ]
-               sync += timeline(self.wishbone.cyc & self.wishbone.stb, [
+               self.sync += timeline(self.wishbone.cyc & self.wishbone.stb, [
                        (1, [self.csr.we.eq(self.wishbone.we)]),
                        (2, [self.wishbone.ack.eq(1)]),
                        (3, [self.wishbone.ack.eq(0)])
                ])
-               return Fragment(sync=sync)
diff --git a/migen/fhdl/size.py b/migen/fhdl/size.py
new file mode 100644 (file)
index 0000000..a116901
--- /dev/null
@@ -0,0 +1,102 @@
+from migen.fhdl import structure as f
+
+def log2_int(n, need_pow2=True):
+       l = 1
+       r = 0
+       while l < n:
+               l *= 2
+               r += 1
+       if need_pow2 and l != n:
+               raise ValueError("Not a power of 2")
+       return r
+
+def bits_for(n, require_sign_bit=False):
+       if n > 0:
+               r = log2_int(n + 1, False)
+       else:
+               require_sign_bit = True
+               r = log2_int(-n, False)
+       if require_sign_bit:
+               r += 1
+       return r
+
+def value_bits_sign(v):
+       if isinstance(v, bool):
+               return 1, False
+       elif isinstance(v, int):
+               return bits_for(v), v < 0
+       elif isinstance(v, f.Signal):
+               return v.nbits, v.signed
+       elif isinstance(v, (f.ClockSignal, f.ResetSignal)):
+               return 1, False
+       elif isinstance(v, f._Operator):
+               obs = list(map(value_bits_sign, v.operands))
+               if v.op == "+" or v.op == "-":
+                       if not obs[0][1] and not obs[1][1]:
+                               # both operands unsigned
+                               return max(obs[0][0], obs[1][0]) + 1, False
+                       elif obs[0][1] and obs[1][1]:
+                               # both operands signed
+                               return max(obs[0][0], obs[1][0]) + 1, True
+                       elif not obs[0][1] and obs[1][1]:
+                               # first operand unsigned (add sign bit), second operand signed
+                               return max(obs[0][0] + 1, obs[1][0]) + 1, True
+                       else:
+                               # first signed, second operand unsigned (add sign bit)
+                               return max(obs[0][0], obs[1][0] + 1) + 1, True
+               elif v.op == "*":
+                       if not obs[0][1] and not obs[1][1]:
+                               # both operands unsigned
+                               return obs[0][0] + obs[1][0]
+                       elif obs[0][1] and obs[1][1]:
+                               # both operands signed
+                               return obs[0][0] + obs[1][0] - 1
+                       else:
+                               # one operand signed, the other unsigned (add sign bit)
+                               return obs[0][0] + obs[1][0] + 1 - 1
+               elif v.op == "<<<":
+                       if obs[1][1]:
+                               extra = 2**(obs[1][0] - 1) - 1
+                       else:
+                               extra = 2**obs[1][0] - 1
+                       return obs[0][0] + extra, obs[0][1]
+               elif v.op == ">>>":
+                       if obs[1][1]:
+                               extra = 2**(obs[1][0] - 1)
+                       else:
+                               extra = 0
+                       return obs[0][0] + extra, obs[0][1]
+               elif v.op == "&" or v.op == "^" or v.op == "|":
+                       if not obs[0][1] and not obs[1][1]:
+                               # both operands unsigned
+                               return max(obs[0][0], obs[1][0]), False
+                       elif obs[0][1] and obs[1][1]:
+                               # both operands signed
+                               return max(obs[0][0], obs[1][0]), True
+                       elif not obs[0][1] and obs[1][1]:
+                               # first operand unsigned (add sign bit), second operand signed
+                               return max(obs[0][0] + 1, obs[1][0]), True
+                       else:
+                               # first signed, second operand unsigned (add sign bit)
+                               return max(obs[0][0], obs[1][0] + 1), True
+               elif v.op == "<" or v.op == "<=" or v.op == "==" or v.op == "!=" \
+                 or v.op == ">" or v.op == ">=":
+                         return 1, False
+               elif v.op == "~":
+                       return obs[0]
+               else:
+                       raise TypeError
+       elif isinstance(v, f._Slice):
+               return v.stop - v.start, value_bits_sign(v.value)[1]
+       elif isinstance(v, f.Cat):
+               return sum(value_bits_sign(sv)[0] for sv in v.l), False
+       elif isinstance(v, f.Replicate):
+               return (value_bits_sign(v.v)[0])*v.n, False
+       elif isinstance(v, f._ArrayProxy):
+               bsc = map(value_bits_sign, v.choices)
+               return max(bs[0] for bs in bsc), any(bs[1] for bs in bsc)
+       else:
+               raise TypeError
+
+def flen(v):
+       return value_bits_sign(v)[0]
index 59ef73038f0b110dd69a472adcf42d5834cf9e8d..f56a7042a9cc6a70852ceeb1aff597d6ca0ce5dc 100644 (file)
@@ -1,4 +1,5 @@
 from migen.fhdl.structure import *
+from migen.fhdl.size import bits_for, value_bits_sign
 from migen.fhdl.tools import *
 from migen.fhdl.tracer import get_obj_var_name
 from migen.fhdl.verilog import _printexpr as verilog_printexpr
diff --git a/migen/fhdl/std.py b/migen/fhdl/std.py
new file mode 100644 (file)
index 0000000..ccdc82c
--- /dev/null
@@ -0,0 +1,4 @@
+from migen.fhdl.structure import *
+from migen.fhdl.module import Module
+from migen.fhdl.specials import TSTriple, Instance, Memory
+from migen.fhdl.size import log2_int, bits_for, flen
index dea8dc7bf337e1074eb675ce4600c424e4d51090..5aee1b3a1a56e596def8cc9e820df3bee80a0a5b 100644 (file)
@@ -5,26 +5,6 @@ from collections import defaultdict
 
 from migen.fhdl import tracer
 
-def log2_int(n, need_pow2=True):
-       l = 1
-       r = 0
-       while l < n:
-               l *= 2
-               r += 1
-       if need_pow2 and l != n:
-               raise ValueError("Not a power of 2")
-       return r
-
-def bits_for(n, require_sign_bit=False):
-       if n > 0:
-               r = log2_int(n + 1, False)
-       else:
-               require_sign_bit = True
-               r = log2_int(-n, False)
-       if require_sign_bit:
-               r += 1
-       return r
-
 class HUID:
        __next_uid = 0
        def __init__(self):
@@ -88,19 +68,21 @@ class Value(HUID):
        
        
        def __getitem__(self, key):
+               from migen.fhdl.size import flen
+
                if isinstance(key, int):
                        if key < 0:
-                               key += len(self)
+                               key += flen(self)
                        return _Slice(self, key, key+1)
                elif isinstance(key, slice):
                        start = key.start or 0
-                       stop = key.stop or len(self)
+                       stop = key.stop or flen(self)
                        if start < 0:
-                               start += len(self)
+                               start += flen(self)
                        if stop < 0:
-                               stop += len(self)
-                       if stop > len(self):
-                               stop = len(self)
+                               stop += flen(self)
+                       if stop > flen(self):
+                               stop = flen(self)
                        if key.step != None:
                                raise KeyError
                        return _Slice(self, start, stop)
@@ -109,9 +91,6 @@ class Value(HUID):
        
        def eq(self, r):
                return _Assign(self, r)
-
-       def __len__(self):
-               return value_bits_sign(self)[0]
        
        def __hash__(self):
                return HUID.__hash__(self)
@@ -142,6 +121,8 @@ class Replicate(Value):
 
 class Signal(Value):
        def __init__(self, bits_sign=None, name=None, variable=False, reset=0, name_override=None, min=None, max=None):
+               from migen.fhdl.size import bits_for
+
                Value.__init__(self)
                
                # determine number of bits and signedness
@@ -304,80 +285,3 @@ class Fragment:
                        self.clock_domains + other.clock_domains,
                        self.sim + other.sim)
 
-def value_bits_sign(v):
-       if isinstance(v, bool):
-               return 1, False
-       elif isinstance(v, int):
-               return bits_for(v), v < 0
-       elif isinstance(v, Signal):
-               return v.nbits, v.signed
-       elif isinstance(v, (ClockSignal, ResetSignal)):
-               return 1, False
-       elif isinstance(v, _Operator):
-               obs = list(map(value_bits_sign, v.operands))
-               if v.op == "+" or v.op == "-":
-                       if not obs[0][1] and not obs[1][1]:
-                               # both operands unsigned
-                               return max(obs[0][0], obs[1][0]) + 1, False
-                       elif obs[0][1] and obs[1][1]:
-                               # both operands signed
-                               return max(obs[0][0], obs[1][0]) + 1, True
-                       elif not obs[0][1] and obs[1][1]:
-                               # first operand unsigned (add sign bit), second operand signed
-                               return max(obs[0][0] + 1, obs[1][0]) + 1, True
-                       else:
-                               # first signed, second operand unsigned (add sign bit)
-                               return max(obs[0][0], obs[1][0] + 1) + 1, True
-               elif v.op == "*":
-                       if not obs[0][1] and not obs[1][1]:
-                               # both operands unsigned
-                               return obs[0][0] + obs[1][0]
-                       elif obs[0][1] and obs[1][1]:
-                               # both operands signed
-                               return obs[0][0] + obs[1][0] - 1
-                       else:
-                               # one operand signed, the other unsigned (add sign bit)
-                               return obs[0][0] + obs[1][0] + 1 - 1
-               elif v.op == "<<<":
-                       if obs[1][1]:
-                               extra = 2**(obs[1][0] - 1) - 1
-                       else:
-                               extra = 2**obs[1][0] - 1
-                       return obs[0][0] + extra, obs[0][1]
-               elif v.op == ">>>":
-                       if obs[1][1]:
-                               extra = 2**(obs[1][0] - 1)
-                       else:
-                               extra = 0
-                       return obs[0][0] + extra, obs[0][1]
-               elif v.op == "&" or v.op == "^" or v.op == "|":
-                       if not obs[0][1] and not obs[1][1]:
-                               # both operands unsigned
-                               return max(obs[0][0], obs[1][0]), False
-                       elif obs[0][1] and obs[1][1]:
-                               # both operands signed
-                               return max(obs[0][0], obs[1][0]), True
-                       elif not obs[0][1] and obs[1][1]:
-                               # first operand unsigned (add sign bit), second operand signed
-                               return max(obs[0][0] + 1, obs[1][0]), True
-                       else:
-                               # first signed, second operand unsigned (add sign bit)
-                               return max(obs[0][0], obs[1][0] + 1), True
-               elif v.op == "<" or v.op == "<=" or v.op == "==" or v.op == "!=" \
-                 or v.op == ">" or v.op == ">=":
-                         return 1, False
-               elif v.op == "~":
-                       return obs[0]
-               else:
-                       raise TypeError
-       elif isinstance(v, _Slice):
-               return v.stop - v.start, value_bits_sign(v.value)[1]
-       elif isinstance(v, Cat):
-               return sum(value_bits_sign(sv)[0] for sv in v.l), False
-       elif isinstance(v, Replicate):
-               return (value_bits_sign(v.v)[0])*v.n, False
-       elif isinstance(v, _ArrayProxy):
-               bsc = map(value_bits_sign, v.choices)
-               return max(bs[0] for bs in bsc), any(bs[1] for bs in bsc)
-       else:
-               raise TypeError
index fa5e65b36bfdf2c12b7aff769c5d4b50246003f3..2d739077fed3dc091c899147078be936667d87ac 100644 (file)
@@ -3,6 +3,7 @@ import collections
 from migen.fhdl.structure import *
 from migen.fhdl.structure import _Slice, _Assign
 from migen.fhdl.visit import NodeVisitor, NodeTransformer
+from migen.fhdl.size import value_bits_sign
 
 def bitreverse(s):
        length, signed = value_bits_sign(s)
index 6708bdffef722e4fc858fc3d37500ff9a5c6269c..66c28799988c0d5bbdd6df0529afc5b88e20c07b 100644 (file)
@@ -4,6 +4,7 @@ from operator import itemgetter
 from migen.fhdl.structure import *
 from migen.fhdl.structure import _Operator, _Slice, _Assign
 from migen.fhdl.tools import *
+from migen.fhdl.size import bits_for, flen
 from migen.fhdl.namer import Namespace, build_namespace
 
 def _printsig(ns, s):
@@ -11,8 +12,8 @@ def _printsig(ns, s):
                n = "signed "
        else:
                n = ""
-       if len(s) > 1:
-               n += "[" + str(len(s)-1) + ":0] "
+       if flen(s) > 1:
+               n += "[" + str(flen(s)-1) + ":0] "
        n += ns.get_name(s)
        return n
 
@@ -63,7 +64,7 @@ def _printexpr(ns, node):
        elif isinstance(node, _Slice):
                # Verilog does not like us slicing non-array signals...
                if isinstance(node.value, Signal) \
-                 and len(node.value) == 1 \
+                 and flen(node.value) == 1 \
                  and node.start == 0 and node.stop == 1:
                          return _printexpr(ns, node.value)
 
index 6d05917f29822132ec2803d5d180470b4de1e62b..d3f4ec178b63918dc52510e4f4eb439b09d2afc5 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.genlib.misc import optree
 from migen.genlib.record import *
 
index 7c20a0eb0fe81b333a196fd55d88deebf91f60aa..2c505558b380baefb1dce5303d2780529773b89a 100644 (file)
@@ -1,7 +1,6 @@
 from collections import defaultdict
 
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.flow.actor import *
 
 class EndpointSimHook(Module):
index 1b7d2ea39ac80ecf1c1ce53383d72b631d0055e3..8238f5e1ccc7db6b04049e9904098fd03fc9d5b5 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.bank.description import *
 from migen.flow.hooks import DFGHook
 
index deaacd328e353def23198152d0e3aee0ead1e167..9bf775a774d272e3ea424e30ff32c42de82c246f 100644 (file)
@@ -1,6 +1,6 @@
 from networkx import MultiDiGraph
 
-from migen.fhdl.structure import *
+from migen.fhdl.std import *
 from migen.genlib.misc import optree
 from migen.flow.actor import *
 from migen.flow import plumbing
index 8edec896193cac46b8f1d54b0131da2bdcc65ba6..23301631c4a9be00e901b9bd51b7b24d35d60b93 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.flow.actor import *
 from migen.genlib.record import *
 from migen.genlib.misc import optree
index 29cee986bb52bf25aaf8706ade58842885e26b6d..34a9a9135beedaa13d90672e52be07a3864b443e 100644 (file)
@@ -1,4 +1,4 @@
-from migen.fhdl.structure import *
+from migen.fhdl.std import *
 
 class ReorderSlot:
        def __init__(self, tag_width, data_width):
index f194ecb7bf342bd02b7019c9be16463cc48c4638..5759c9299429ae2509903b623b7db1c345e880d6 100644 (file)
@@ -1,5 +1,5 @@
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
+from migen.fhdl.size import value_bits_sign
 from migen.fhdl.specials import Special
 from migen.fhdl.tools import list_signals
 
index 34c98224dfeeb6db96fd0121b4fc527b95213f1e..e876fb632fe77ce9951582f898137dc1b481037e 100644 (file)
@@ -1,4 +1,4 @@
-from migen.fhdl.structure import *
+from migen.fhdl.std import *
 
 class Complex:
        def __init__(self, real, imag):
index 62b87c21004374c2110d7614dd5514563e91156a..05459332d041d1ca43ce864979598955b43e194f 100644 (file)
@@ -1,9 +1,7 @@
-from migen.fhdl.structure import *
+from migen.fhdl.std import *
 
-class Divider:
+class Divider(Module):
        def __init__(self, w):
-               self.w = w
-               
                self.start_i = Signal()
                self.dividend_i = Signal(w)
                self.divisor_i = Signal(w)
@@ -11,21 +9,20 @@ class Divider:
                self.quotient_o = Signal(w)
                self.remainder_o = Signal(w)
        
-       def get_fragment(self):
-               w = self.w
+               ###
                
                qr = Signal(2*w)
                counter = Signal(max=w+1)
                divisor_r = Signal(w)
                diff = Signal(w+1)
                
-               comb = [
+               self.comb += [
                        self.quotient_o.eq(qr[:w]),
                        self.remainder_o.eq(qr[w:]),
                        self.ready_o.eq(counter == 0),
                        diff.eq(self.remainder_o - divisor_r)
                ]
-               sync = [
+               self.sync += [
                        If(self.start_i,
                                counter.eq(w),
                                qr.eq(self.dividend_i),
@@ -39,4 +36,3 @@ class Divider:
                                        counter.eq(counter - 1)
                        )
                ]
-               return Fragment(comb, sync)
index c0e1e107444c51e8cccc83efa2f0a4a70b1054de..6c4a4962aa9bc9e5f1c649351a63be0007d1d42c 100644 (file)
@@ -1,10 +1,8 @@
-from migen.fhdl.structure import *
-from migen.fhdl.specials import Memory
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.genlib.cdc import NoRetiming, MultiReg, GrayCounter
 
 def _inc(signal, modulo):
-       if modulo == 2**len(signal):
+       if modulo == 2**flen(signal):
                return signal.eq(signal + 1)
        else:
                return If(signal == (modulo - 1),
index 85f3a401a1dad658cfc9993afd6e17fc246e0097..300e8e9fa902c09aa002261cebfce0020adcf733 100644 (file)
@@ -1,4 +1,4 @@
-from migen.fhdl.structure import *
+from migen.fhdl.std import *
 
 class FSM:
        def __init__(self, *states, delayed_enters=[]):
index 20947d6aca0b3a6d7b94e660ee3952f46e78363f..66d411b074fc1779ddfca6fb9db5ed1c697d66e1 100644 (file)
@@ -1,5 +1,4 @@
-from migen.fhdl.structure import *
-from migen.fhdl.specials import Memory
+from migen.fhdl.std import *
 from migen.flow.actor import *
 from migen.flow.actor import _Endpoint
 from migen.flow.transactions import *
index fc0469dbe94f7231c99aff9e8c12e5b10dd0f25b..97d0be0e07aa6bdd749a3aef7e7c3c167ba2d38a 100644 (file)
@@ -1,4 +1,4 @@
-from migen.fhdl.structure import *
+from migen.fhdl.std import *
 from migen.fhdl.structure import _Operator
 
 def optree(op, operands, lb=None, ub=None, default=None):
@@ -30,8 +30,8 @@ def split(v, *counts):
 
 def displacer(signal, shift, output, n=None, reverse=False):
        if n is None:
-               n = 2**len(shift)
-       w = len(signal)
+               n = 2**flen(shift)
+       w = flen(signal)
        if reverse:
                r = reversed(range(n))
        else:
@@ -41,8 +41,8 @@ def displacer(signal, shift, output, n=None, reverse=False):
 
 def chooser(signal, shift, output, n=None, reverse=False):
        if n is None:
-               n = 2**len(shift)
-       w = len(output)
+               n = 2**flen(shift)
+       w = flen(output)
        cases = {}
        for i in range(n):
                if reverse:
index 13b730fb0176e2b0388541f5b774b71846cac30f..d2d355ce2e228db83c6ac1218f2691161adb8b44 100644 (file)
@@ -1,4 +1,4 @@
-from migen.fhdl.structure import *
+from migen.fhdl.std import *
 from migen.fhdl.tracer import get_obj_var_name
 from migen.genlib.misc import optree
 
index f55b3feeb0ca4b13c35daecc951ed0274431af22..15bec5c7f3bce3dd30082277901b51a575494031 100644 (file)
@@ -1,23 +1,23 @@
-from migen.fhdl.structure import *
+from migen.fhdl.std import *
 
 (SP_WITHDRAW, SP_CE) = range(2)
 
-class RoundRobin:
+class RoundRobin(Module):
        def __init__(self, n, switch_policy=SP_WITHDRAW):
-               self.n = n
-               self.request = Signal(self.n)
-               self.grant = Signal(max=self.n)
+               self.request = Signal(n)
+               self.grant = Signal(max=n)
                self.switch_policy = switch_policy
                if self.switch_policy == SP_CE:
                        self.ce = Signal()
        
-       def get_fragment(self):
-               if self.n > 1:
+               ###
+
+               if n > 1:
                        cases = {}
-                       for i in range(self.n):
+                       for i in range(n):
                                switch = []
-                               for j in reversed(range(i+1,i+self.n)):
-                                       t = j % self.n
+                               for j in reversed(range(i+1,i+n)):
+                                       t = j % n
                                        switch = [
                                                If(self.request[t],
                                                        self.grant.eq(t)
@@ -33,6 +33,6 @@ class RoundRobin:
                        statement = Case(self.grant, cases)
                        if self.switch_policy == SP_CE:
                                statement = If(self.ce, statement)
-                       return Fragment(sync=[statement])
+                       self.sync += statement
                else:
-                       return Fragment([self.grant.eq(0)])
+                       self.comb += self.grant.eq(0)
index 6b6cbcb27ccb9089c308bf033197c0136b512a21..cda649e9b0bc1e78e4d2b90600213f49e80dd154 100644 (file)
@@ -1,8 +1,7 @@
 import ast
 from itertools import zip_longest
 
-from migen.fhdl.structure import *
-from migen.fhdl.specials import Memory
+from migen.fhdl.std import *
 from migen.flow.actor import Source, Sink
 from migen.flow.transactions import *
 from migen.bus import wishbone
index 175aa17e4f0dd52299070432769d6bef75c0ef52..5e05e5beba78248eb54b2dd48dae49e586320c2b 100644 (file)
@@ -1,7 +1,6 @@
 from operator import itemgetter
 
-from migen.fhdl.structure import *
-from migen.fhdl.module import Module
+from migen.fhdl.std import *
 from migen.fhdl import visit as fhdl
 
 class AbstractLoad:
index 960c15bbe0b6ab798d24ecdc43379149a1c800ff..ab52e29ebc2c78cf5ec2e02d3c8f1f2aea11a883 100644 (file)
@@ -1,8 +1,4 @@
-# Copyright (C) 2012 Vermeer Manufacturing Co.
-# License: GPLv3 with additional permissions (see README).
-
-from migen.fhdl.structure import *
-from migen.fhdl.specials import Memory
+from migen.fhdl.std import *
 from migen.fhdl import verilog
 from migen.sim.ipc import *
 from migen.sim import icarus
@@ -132,7 +128,7 @@ class Simulator:
                        nbits = item.width
                else:
                        signed = item.signed
-                       nbits = len(item)
+                       nbits = flen(item)
                value = reply.value & (2**nbits - 1)
                if signed and (value & 2**(nbits - 1)):
                        value -= 2**nbits
@@ -145,7 +141,7 @@ class Simulator:
                if isinstance(item, Memory):
                        nbits = item.width
                else:
-                       nbits = len(item)
+                       nbits = flen(item)
                if value < 0:
                        value += 2**nbits
                assert(value >= 0 and value < 2**nbits)