X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fbsv%2Factual_pinmux.py;h=d39600b478af9925dbfe95e22f590dcc6e38a4f3;hb=1620d4888fbc6e35aa1336e4f86da15428672910;hp=d2ce8160341df4890df5f777ea0b1202906542a7;hpb=1b6fa9b183cfa6c14a58c45cd899314a0bc7922b;p=pinmux.git diff --git a/src/bsv/actual_pinmux.py b/src/bsv/actual_pinmux.py index d2ce816..d39600b 100644 --- a/src/bsv/actual_pinmux.py +++ b/src/bsv/actual_pinmux.py @@ -24,13 +24,6 @@ dedicated_wire = ''' digits = maketrans('0123456789', ' ' * 10) # delete space later -def get_cell_bit_width(p): - max_num_cells = 0 - for cell in p.muxed_cells: - max_num_cells = max(len(cell) - 1, max_num_cells) - return int(math.log(max_num_cells + 1, 2)) - - def cn(idx): # idx is an integer return "cell%s_mux" % str(idx) @@ -110,13 +103,15 @@ def mkmux(p, ifaces, cell, suffix, outenmode): multiple inputs and, based on an "address" routes a given indexed input through to the (one) output """ + cellnum = cell[0] comment = 'outen' if outenmode else 'output' fmtstr = "\t\t\twr%s==%d?%s:%s\n" # mux-selector format ret = '' - ret += " // %s muxer for cell idx %s\n" % (comment, cell[0]) - ret += " %s%s=\n" % (cn(cell[0]), suffix) + ret += " // %s muxer for cell idx %s\n" % (comment, cellnum) + ret += " %s%s=\n" % (cn(cellnum), suffix) + i = 0 for i in range( - 0, (1 << p.cell_bitwidth) - 1): # full mux range (minus 1) + 0, p.get_muxwidth(cellnum) - 1): # full mux range (minus 1) comment = mkcomment(ifaces, cell, i, outenmode) cf = fmt(ifaces, cell, i, suffix) ret += fmtstr % (cn(cell[0]), i, cf, comment) @@ -147,11 +142,15 @@ def init(p, ifaces): the last one, and we do not want the "default" (last line) to be the output. """ - p.cell_bitwidth = get_cell_bit_width(p) p.pinmux = ' ' global dedicated_wire for cell in p.muxed_cells: + cellidx = cell[0] + + p.pinmux += " // --------------------\n" + p.pinmux += " // ----- cell %s -----\n\n" % (cellidx) + # first do the outputs p.pinmux += mkmux(p, ifaces, cell, '_out', False) p.pinmux += "\n" @@ -167,7 +166,7 @@ def init(p, ifaces): # since the interfaces are always standard and cannot change from # user-to-user. Plus this also reduces human-error as well :) p.pinmux += "\n" - p.pinmux += " // priority-in-muxer for cell idx %s\n" % (cell[0]) + p.pinmux += " // priority-in-muxer for cell idx %s\n" % (cellidx) for i in range(0, len(cell) - 1): cname = cell[i + 1] if not cname: # skip blank entries, no need to test @@ -179,14 +178,11 @@ def init(p, ifaces): str(cname) + \ " of pinmap.txt isn't present \nin the current" + \ " dictionary. Update dictionary or fix-typo." - if x == "input": - p.pinmux += \ - mux_wire.format(cell[0], i, "wr" + cname) + "\n" - elif x == "inout": - p.pinmux += \ - mux_wire.format(cell[0], i, "wr" + cname + - "_in") + "\n" - # ============================================================ # + bwid = p.get_muxbitwidth(cellidx) + if bwid > 0: + muxcell(p, cname, x, cell, i) + else: + dedcell(p, x, cell) # ================== Logic for dedicated pins ========= # p.pinmux += "\n /*=========================================*/\n" @@ -197,12 +193,20 @@ def init(p, ifaces): temp = transfn(cell[1]) x = ifaces.getifacetype(temp) #print cell, temp, x - if x == "input": - p.pinmux += \ - dedicated_wire.format(cell[0], "wr" + cell[1]) + "\n" - elif x == "inout": - p.pinmux += \ - dedicated_wire.format(cell[0], "wr" + cell[1] + "_in") + "\n" - else: - p.pinmux += "\n" - # =======================================================# + dedcell(p, x, cell) + +def muxcell(p, cname, x, cell, i): + if x == "input": + p.pinmux += \ + mux_wire.format(cell[0], i, "wr" + cname) + "\n" + elif x == "inout": + p.pinmux += \ + mux_wire.format(cell[0], i, "wr" + cname + + "_in") + "\n" +def dedcell(p, x, cell): + if x == "input": + p.pinmux += \ + dedicated_wire.format(cell[0], "wr" + cell[1]) + "\n" + elif x == "inout": + p.pinmux += \ + dedicated_wire.format(cell[0], "wr" + cell[1] + "_in") + "\n"