Exemple #1
0
def main():
    segmk = Segmaker("design.bits")

    fuz_dir = os.getenv("FUZDIR", None)
    assert fuz_dir
    with open(os.path.join(fuz_dir, "attrs.json"), "r") as attr_file:
        attrs = json.load(attr_file)

    print("Loading tags")
    with open('params.json') as f:
        params = json.load(f)

        site = params['site']

        for param, param_info in attrs.items():
            value = params[param]
            param_type = param_info["type"]
            param_digits = param_info["digits"]
            param_values = param_info["values"]

            if param_type == BIN:
                bitstr = [
                    int(x) for x in "{value:0{digits}b}".format(
                        value=value, digits=param_digits)[::-1]
                ]

                for i in range(param_digits):
                    segmk.add_site_tag(site, "%s[%u]" % (param, i), bitstr[i])
            else:
                assert param_type == BOOL
                segmk.add_site_tag(site, param, value == "TRUE")

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #2
0
def handle_design(prefix, second_pass):
    segmk = Segmaker(prefix + ".bits")

    tiledata = dict()
    nlines = 0

    print("Loading tags from design.txt.")
    with open(prefix + ".txt", "r") as f:
        for line in f:
            tile, pip, src, dst, pnum, pdir = line.split()
            _, pip = pip.split(".")
            _, src = src.split("/")
            _, dst = dst.split("/")
            pnum = int(pnum)
            pdir = int(pdir)

            if tile not in tiledata:
                tiledata[tile] = {"pips": set(), "srcs": set(), "dsts": set()}

            if pip in pipdata:
                assert pipdata[pip] == (src, dst)
            else:
                pipdata[pip] = (src, dst)

            tiledata[tile]["pips"].add(pip)
            tiledata[tile]["srcs"].add(src)
            tiledata[tile]["dsts"].add(dst)

            if pdir == 0:
                tiledata[tile]["srcs"].add(dst)
                tiledata[tile]["dsts"].add(src)

            if pnum == 1 or pdir == 0 or \
                    re.match(r"^(L[HV]B?)(_L)?(_B)?[0-9]", src) or \
                    re.match(r"^(L[HV]B?)(_L)?(_B)?[0-9]", dst) or \
                    re.match(r"^(CTRL|GFAN)(_L)?[0-9]", dst):
                ignpip.add(pip)

            nlines += 1

    if nlines == 0:
        return

    for tile, pips_srcs_dsts in tiledata.items():
        pips = pips_srcs_dsts["pips"]
        srcs = pips_srcs_dsts["srcs"]
        dsts = pips_srcs_dsts["dsts"]

        for pip, src_dst in pipdata.items():
            src, dst = src_dst
            if pip in ignpip:
                pass
            elif pip in pips:
                segmk.addtag(tile, "%s.%s" % (dst, src), 1)
            elif src_dst[1] not in dsts:
                segmk.addtag(tile, "%s.%s" % (dst, src), 0)

    if second_pass:
        segmk.compile()
        segmk.write(prefix[7:])
Exemple #3
0
def main():
    segmk = Segmaker("design.bits")

    print("Loading tags")
    with open('params.json') as f:
        params = json.load(f)

        site = params['site']

        for param, _ in boolean_params:
            value = params[param]

            segmk.add_site_tag(site, param, value)

        for param, digits in hex_params + int_params:
            value = int(params[param])
            bitstr = [
                int(x)
                for x in "{value:0{digits}b}".format(value=value,
                                                     digits=digits)[::-1]
            ]

            for i in range(digits):
                segmk.add_site_tag(site, '%s[%u]' % (param, i), bitstr[i])

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #4
0
def main():
    segmk = Segmaker("design.bits")

    tiledata = {}
    pipdata = {}
    ignpip = set()
    tile_ports = {}

    read_pip_data('gtp_common_mid_ck_mux.txt', pipdata, tile_ports)

    print("Loading tags from design.txt.")
    with open("design.txt", "r") as f:
        for line in f:
            tile, pip, src, dst, pnum, pdir = line.split()

            if not tile.startswith('GTP_COMMON_MID'):
                continue

            pip_prefix, _ = pip.split(".")
            tile_from_pip, tile_type = pip_prefix.split('/')
            assert tile == tile_from_pip
            _, src = src.split("/")
            _, dst = dst.split("/")
            pnum = int(pnum)
            pdir = int(pdir)

            if tile not in tiledata:
                tiledata[tile] = {
                    "type": tile_type,
                    "pips": set(),
                    "srcs": set(),
                    "dsts": set()
                }

            tiledata[tile]["pips"].add((src, dst))
            tiledata[tile]["srcs"].add(src)
            tiledata[tile]["dsts"].add(dst)

            if pdir == 0:
                tiledata[tile]["srcs"].add(dst)
                tiledata[tile]["dsts"].add(src)

            if "HCLK_GTP_CK_MUX" not in src:
                ignpip.add((src, dst))

    for tile, pips_srcs_dsts in tiledata.items():
        tile_type = pips_srcs_dsts["type"]
        pips = pips_srcs_dsts["pips"]

        for src, dst in pipdata["GTP_COMMON"]:
            if (src, dst) in ignpip:
                pass
            elif (src, dst) in pips:
                segmk.add_tile_tag(tile, "%s.%s" % (dst, src), 1)
            elif src not in tiledata[tile]["srcs"] and dst not in tiledata[
                    tile]["dsts"]:
                segmk.add_tile_tag(tile, "%s.%s" % (dst, src), 0)

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #5
0
def main():
    segmk = Segmaker("design.bits")

    tiledata = {}
    pipdata = {}
    ignpip = set()
    tile_ports = {}

    read_pip_data('pcie_int_interface_l.txt', pipdata, tile_ports)
    read_pip_data('pcie_int_interface_r.txt', pipdata, tile_ports)

    print("Loading tags from design.txt.")
    with open("design.txt", "r") as f:
        for line in f:
            tile, pip, src, dst, pnum, pdir = line.split()

            if not tile.startswith('PCIE_INT_INTERFACE'):
                continue

            pip_prefix, _ = pip.split(".")
            tile_from_pip, tile_type = pip_prefix.split('/')
            assert tile == tile_from_pip
            _, src = src.split("/")
            _, dst = dst.split("/")
            pnum = int(pnum)
            pdir = int(pdir)

            if tile not in tiledata:
                tiledata[tile] = {
                    "type": tile_type,
                    "pips": set(),
                    "srcs": set(),
                    "dsts": set()
                }

            tiledata[tile]["pips"].add((src, dst))
            tiledata[tile]["srcs"].add(src)
            tiledata[tile]["dsts"].add(dst)

            if pdir == 0:
                tiledata[tile]["srcs"].add(dst)
                tiledata[tile]["dsts"].add(src)

    for tile, pips_srcs_dsts in tiledata.items():
        tile_type = pips_srcs_dsts["type"]
        pips = pips_srcs_dsts["pips"]

        for src, dst in pipdata[tile_type]:
            if (src, dst) in ignpip:
                pass
            elif (src, dst) in pips:
                segmk.add_tile_tag(tile, "%s.%s" % (dst, src), 1)
            else:
                segmk.add_tile_tag(tile, "%s.%s" % (dst, src), 0)

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #6
0
def run():

    segmk = Segmaker("design.bits")

    clk_inverts = {}
    with open('design.csv', 'r') as f:
        for params in csv.DictReader(f):
            clk_inverts[params['site']] = params

    print("Loading tags")
    f = open('params.jl', 'r')
    f.readline()
    for l in f:
        j = json.loads(l)
        ps = j['params']
        assert j['module'] == 'my_RAMB18E1'
        site = verilog.unquote(ps['LOC'])

        bus_tags(segmk, ps, site)
        if ps['RAM_MODE'] == '"TDP"':
            rw_width_tags(segmk, ps, site)
        segmk.add_site_tag(
            site, 'SDP_READ_WIDTH_36', ps['RAM_MODE'] == '"SDP"'
            and int(ps['READ_WIDTH_A']) == 36)
        segmk.add_site_tag(
            site, 'SDP_WRITE_WIDTH_36', ps['RAM_MODE'] == '"SDP"'
            and int(ps['WRITE_WIDTH_B']) == 36)

        if ps['READ_WIDTH_A'] < 36 and ps['WRITE_WIDTH_B'] < 36:
            isinv_tags(segmk, ps, site, clk_inverts[site])
            write_mode_tags(segmk, ps, site)
            write_rstreg_priority(segmk, ps, site)
            write_rdaddr_collision(segmk, ps, site)

    def bitfilter(frame, bit):
        # rw_width_tags() aliasing interconnect on large widths
        return frame not in (0, 20, 21)

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #7
0
def run():

    segmk = Segmaker("design.bits")

    clk_inverts = {}
    with open('design.csv', 'r') as f:
        for params in csv.DictReader(f):
            clk_inverts[params['site']] = params

    print("Loading tags")
    f = open('params.jl', 'r')
    f.readline()
    for l in f:
        j = json.loads(l)
        ps = j['params']
        assert j['module'] == 'my_RAMB18E1'
        site = verilog.unquote(ps['LOC'])

        isinv_tags(segmk, ps, site, clk_inverts[site])
        bus_tags(segmk, ps, site)
        rw_width_tags(segmk, ps, site)
        write_mode_tags(segmk, ps, site)
        write_rstreg_priority(segmk, ps, site)
        write_rdaddr_collision(segmk, ps, site)

    def bitfilter(frame, bit):
        # rw_width_tags() aliasing interconnect on large widths
        return frame not in (20, 21)

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #8
0
def main():
    segmk = Segmaker("design.bits")

    print("Loading tags")
    with open('params.json') as f:
        params = json.load(f)

    for tile_param in params:
        for param, tag in (
            ('Y0_IN_USE', 'RAMB18_Y0.IN_USE'),
            ('Y1_IN_USE', 'RAMB18_Y1.IN_USE'),
            ('FIFO_Y0_IN_USE', 'RAMB18_Y0.FIFO_MODE'),
            ('FIFO_Y1_IN_USE', 'RAMB18_Y1.FIFO_MODE'),
        ):
            segmk.add_tile_tag(tile_param['tile'], tag, tile_param[param])

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #9
0
def run():

    segmk = Segmaker("design.bits")

    print("Loading tags")
    f = open('params.jl', 'r')
    f.readline()
    for l in f:
        j = json.loads(l)
        bus_tags(segmk, j, j['site'])

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #10
0
def main():
    segmk = Segmaker("design.bits")

    print("Loading tags")
    with open('params.json') as f:
        params = json.load(f)

    for tile_param in params:
        if tile_param['EN_SYN'] and tile_param['DATA_WIDTH'] == 4:
            output_integer_tags(segmk,
                                tile_param,
                                'ALMOST_EMPTY_OFFSET',
                                invert=True)
            output_integer_tags(segmk,
                                tile_param,
                                'ALMOST_FULL_OFFSET',
                                invert=True)

        for param in ('EN_SYN', 'FIRST_WORD_FALL_THROUGH'):
            segmk.add_tile_tag(tile_param['tile'], param, tile_param[param])

    segmk.compile()
    segmk.write()
Exemple #11
0
def run():

    segmk = Segmaker("design.bits")

    print("Loading tags")
    f = open('params.jl', 'r')
    f.readline()
    for l in f:
        j = json.loads(l)
        ps = j['params']
        assert j['module'] == 'my_PLLE2_ADV'
        site = verilog.unquote(ps['LOC'])

        bus_tags(segmk, ps, site)

    segmk.compile()
    segmk.write()
Exemple #12
0
def run():

    segmk = Segmaker("design.bits")

    print("Loading params")
    f = open("params.json")
    params = json.load(f)
    params = {p["site"]: p for p in params}

    print("Loading tags")
    f = open('params.jl', 'r')
    f.readline()
    for l in f:
        j = json.loads(l)
        bus_tags(segmk, j, params, j['site'])

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #13
0
#!/usr/bin/env python3

# FIXME: getting two bits
# 00_40 31_46
# Can we find instance where they are not aliased?
WA7USED = 0

import sys, re, os

from prjxray.segmaker import Segmaker

segmk = Segmaker("design.bits")

print("Loading tags")
'''
module,loc,c31,b31,a31
my_NDI1MUX_NI_NMC31,SLICE_X12Y100,1,1,0
my_NDI1MUX_NI_NMC31,SLICE_X12Y101,1,1,1
my_NDI1MUX_NI_NMC31,SLICE_X12Y102,1,1,1
'''
f = open('params.csv', 'r')
f.readline()
for l in f:
    l = l.strip()
    module, loc, c31, b31, a31 = l.split(',')
    c31 = int(c31)
    b31 = int(b31)
    a31 = int(a31)
    segmk.add_site_tag(loc, "ADI1MUX.AI", 1 ^ a31)
    segmk.add_site_tag(loc, "BDI1MUX.BI", 1 ^ b31)
    segmk.add_site_tag(loc, "CDI1MUX.CI", 1 ^ c31)
Exemple #14
0
def main():
    segmk = Segmaker("design.bits")

    tiledata = {}
    pipdata = {}
    ignpip = set()

    with open(os.path.join(os.getenv('FUZDIR'), '..', 'piplist', 'build',
                           'clk_bufg', 'clk_bufg_bot_r.txt')) as f:
        for l in f:
            tile_type, dst, src = l.strip().split('.')
            if tile_type not in pipdata:
                pipdata[tile_type] = []

            pipdata[tile_type].append((src, dst))

    with open(os.path.join(os.getenv('FUZDIR'), '..', 'piplist', 'build',
                           'clk_bufg', 'clk_bufg_top_r.txt')) as f:
        for l in f:
            tile_type, dst, src = l.strip().split('.')
            if tile_type not in pipdata:
                pipdata[tile_type] = []

            pipdata[tile_type].append((src, dst))

    print("Loading tags from design.txt.")
    with open("design.txt", "r") as f:
        for line in f:
            tile, pip, src, dst, pnum, pdir = line.split()

            if not tile.startswith('CLK_BUFG'):
                continue

            if tile.startswith('CLK_BUFG_REBUF'):
                continue

            pip_prefix, _ = pip.split(".")
            tile_from_pip, tile_type = pip_prefix.split('/')
            assert tile == tile_from_pip
            _, src = src.split("/")
            _, dst = dst.split("/")
            pnum = int(pnum)
            pdir = int(pdir)

            if tile not in tiledata:
                tiledata[tile] = {
                    "type": tile_type,
                    "pips": set(),
                    "srcs": set(),
                    "dsts": set()
                }

            tiledata[tile]["pips"].add((src, dst))
            tiledata[tile]["srcs"].add(src)
            tiledata[tile]["dsts"].add(dst)

            if pdir == 0:
                tiledata[tile]["srcs"].add(dst)
                tiledata[tile]["dsts"].add(src)

            muxed_src = re.match(
                '^CLK_BUFG_(TOP|BOT)_R_CK_MUXED', src) is not None

            if pnum == 1 or pdir == 0 or \
                muxed_src:
                ignpip.add((src, dst))

    for tile, pips_srcs_dsts in tiledata.items():
        tile_type = pips_srcs_dsts["type"]
        pips = pips_srcs_dsts["pips"]

        for src, dst in pipdata[tile_type]:
            if (src, dst) in ignpip:
                pass
            elif (src, dst) in pips:
                segmk.add_tile_tag(tile, "%s.%s" % (dst, src), 1)
            elif dst not in tiledata[tile]["dsts"]:
                segmk.add_tile_tag(tile, "%s.%s" % (dst, src), 0)

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #15
0
def main():
    segmk = Segmaker("design.bits")

    tiledata = {}
    pipdata = {}
    ignpip = set()
    tile_ports = {}

    with open(
            os.path.join(os.getenv('FUZDIR'), '..', 'piplist', 'build',
                         'hclk_ioi3', 'hclk_ioi3.txt')) as f:
        for l in f:
            tile_type, dst, src = l.strip().split('.')
            if tile_type not in pipdata:
                pipdata[tile_type] = []
                tile_ports[tile_type] = set()

            pipdata[tile_type].append((src, dst))
            tile_ports[tile_type].add(src)
            tile_ports[tile_type].add(dst)

    print("Loading tags from design.txt.")
    with open("design.txt", "r") as f:
        for line in f:
            tile, pip, src, dst, pnum, pdir = line.split()

            if not tile.startswith('HCLK_IOI3'):
                continue

            pip_prefix, _ = pip.split(".")
            tile_from_pip, tile_type = pip_prefix.split('/')
            assert tile == tile_from_pip
            _, src = src.split("/")
            _, dst = dst.split("/")
            pnum = int(pnum)
            pdir = int(pdir)

            if tile not in tiledata:
                tiledata[tile] = {
                    "type": tile_type,
                    "pips": set(),
                    "srcs": set(),
                    "dsts": set()
                }

            tiledata[tile]["pips"].add((src, dst))
            tiledata[tile]["srcs"].add(src)
            tiledata[tile]["dsts"].add(dst)

            if pdir == 0:
                tiledata[tile]["srcs"].add(dst)
                tiledata[tile]["dsts"].add(src)

            if "IDELAYCTRL" not in dst:
                ignpip.add((src, dst))

    for tile, pips_srcs_dsts in tiledata.items():
        tile_type = pips_srcs_dsts["type"]
        pips = pips_srcs_dsts["pips"]

        for src, dst in pipdata[tile_type]:
            if (src, dst) in ignpip:
                pass
            elif (src, dst) in pips:
                segmk.add_tile_tag(tile, "%s.%s" % (dst, src), 1)
            elif dst not in tiledata[tile]["dsts"]:
                segmk.add_tile_tag(tile, "%s.%s" % (dst, src), 0)

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #16
0
def main():
    segmk = Segmaker("design.bits")

    tiledata = {}
    pipdata = {}
    ignpip = set()
    tile_ports = {}

    with open(
            os.path.join(os.getenv('FUZDIR'), '..', 'piplist', 'build',
                         'hclk_cmt', 'hclk_cmt.txt')) as f:
        for l in f:
            tile_type, dst, src = l.strip().split('.')
            if tile_type not in pipdata:
                pipdata[tile_type] = []
                tile_ports[tile_type] = set()

            pipdata[tile_type].append((src, dst))
            tile_ports[tile_type].add(src)
            tile_ports[tile_type].add(dst)

    with open(
            os.path.join(os.getenv('FUZDIR'), '..', 'piplist', 'build',
                         'hclk_cmt', 'hclk_cmt_l.txt')) as f:
        for l in f:
            tile_type, dst, src = l.strip().split('.')
            if tile_type not in pipdata:
                pipdata[tile_type] = []
                tile_ports[tile_type] = set()

            pipdata[tile_type].append((src, dst))
            tile_ports[tile_type].add(src)
            tile_ports[tile_type].add(dst)

    tile_to_cmt = {}
    cmt_to_hclk_cmt = {}
    with open(os.path.join(os.getenv('FUZDIR'), 'build',
                           'cmt_regions.csv')) as f:
        for l in f:
            site, cmt, tile = l.strip().split(',')

            tile_to_cmt[tile] = cmt

            if tile.startswith('HCLK_CMT'):
                cmt_to_hclk_cmt[cmt] = tile

    active_ioclks = set()

    print("Loading tags from design.txt.")
    with open("design.txt", "r") as f:
        for line in f:
            tile, pip, src, dst, pnum, pdir = line.split()

            pip_prefix, _ = pip.split(".")
            tile_from_pip, tile_type = pip_prefix.split('/')
            assert tile == tile_from_pip
            _, src = src.split("/")
            _, dst = dst.split("/")
            pnum = int(pnum)
            pdir = int(pdir)

            if src in IOCLK_MAP:
                active_ioclks.add(
                    (cmt_to_hclk_cmt[tile_to_cmt[tile]], IOCLK_MAP[src]))

            if not tile.startswith('HCLK_CMT'):
                continue

            if tile not in tiledata:
                tiledata[tile] = {
                    "type": tile_type,
                    "pips": set(),
                    "srcs": set(),
                    "dsts": set()
                }

            tiledata[tile]["pips"].add((src, dst))
            tiledata[tile]["srcs"].add(src)
            tiledata[tile]["dsts"].add(dst)

            if pdir == 0:
                tiledata[tile]["srcs"].add(dst)
                tiledata[tile]["dsts"].add(src)

            if pnum == 1 or pdir == 0:
                ignpip.add((src, dst))

    for tile, pips_srcs_dsts in tiledata.items():
        tile_type = pips_srcs_dsts["type"]
        pips = pips_srcs_dsts["pips"]

        for src, dst in pipdata[tile_type]:
            if (src, dst) in ignpip:
                pass
            elif (src, dst) in pips:
                segmk.add_tile_tag(tile, "%s.%s" % (dst, src), 1)
            elif dst not in tiledata[tile]["dsts"]:
                segmk.add_tile_tag(tile, "%s.%s" % (dst, src), 0)

        for port in tile_ports[tile_type]:

            # These ones do not have any outgoing connections from the tile.
            if "FREQ_REF" in port:
                continue

            # There seems to be no special bits related to use of
            # HCLK_CMT_MUX_CLKINT_n wires.
            if "HCLK_CMT_MUX_CLKINT" in port:
                continue

            # It seems that CCIOn_USED is not enabled when a net goes through
            # FREQ_REFn. Do not emit this tag if this happens.
            if "CCIO" in port:
                n = int(port[-1])
                dst = "HCLK_CMT_MUX_OUT_FREQ_REF{}".format(n)
                if dst in tiledata[tile]["dsts"]:
                    continue

            if port in tiledata[tile]["dsts"] or port in tiledata[tile]["srcs"]:
                segmk.add_tile_tag(tile, "{}_USED".format(port), 1)
            else:
                segmk.add_tile_tag(tile, "{}_USED".format(port), 0)

        for ioclk in IOCLK_SRCS:
            if ioclk in tiledata[tile]["srcs"] or (tile,
                                                   ioclk) in active_ioclks:
                segmk.add_tile_tag(tile, "{}_ACTIVE".format(ioclk), 1)
            else:
                segmk.add_tile_tag(tile, "{}_ACTIVE".format(ioclk), 0)

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #17
0
def main():
    segmk = Segmaker("design.bits")

    designdata = {}
    tiledata = {}
    pipdata = {}
    ppipdata = {}
    ignpip = set()
    all_clks = {}

    piplists = ['cmt_top_l_lower_b.txt', 'cmt_top_r_lower_b.txt']
    wirelists = ['cmt_top_l_lower_b_wires.txt', 'cmt_top_r_lower_b_wires.txt']
    ppiplists = ['ppips_cmt_top_l_lower_b.db', 'ppips_cmt_top_r_lower_b.db']

    # Load PIP lists
    print("Loading PIP lists...")
    for piplist in piplists:
        with open(os.path.join(os.getenv('FUZDIR'), '..', 'piplist', 'build',
                               'cmt_top_lower', piplist)) as f:
            for l in f:
                pip, is_directional = l.strip().split(' ')
                tile_type, dst, src = pip.split('.')
                if tile_type not in pipdata:
                    pipdata[tile_type] = []
                    all_clks[tile_type] = set()

                pipdata[tile_type].append((src, dst))
                if dst.split('_')[-1].startswith('CLK'):
                    all_clks[tile_type].add(src)

                if not int(is_directional):
                    pipdata[tile_type].append((dst, src))
                    if src.split('_')[-1].startswith('CLK'):
                        all_clks[tile_type].add(dst)

    wiredata = {}
    for wirelist in wirelists:
        with open(os.path.join(os.getenv('FUZDIR'), '..', 'piplist', 'build',
                               'cmt_top_lower', wirelist)) as f:
            for l in f:
                tile_type, wire = l.strip().split()

                if tile_type not in wiredata:
                    wiredata[tile_type] = set()

                wiredata[tile_type].add(wire)

    # Load PPIP lists (to exclude them)
    print("Loading PPIP lists...")
    for ppiplist in ppiplists:
        fname = os.path.join(
            os.getenv('FUZDIR'), '..', '071-ppips', 'build', ppiplist)
        with open(fname, 'r') as f:
            for l in f:
                pip_data, pip_type = l.strip().split()

                if pip_type != 'always':
                    continue

                tile_type, dst, src = pip_data.split('.')
                if tile_type not in ppipdata:
                    ppipdata[tile_type] = []

                ppipdata[tile_type].append((src, dst))

    # Load desgin data
    print("Loading design data...")
    with open("design.txt", "r") as f:
        for line in f:
            fields = line.strip().split(",")
            designdata[fields[0]] = fields[1:]

    with open("design_pips.txt", "r") as f:
        for line in f:
            tile, pip, src, dst, pnum, pdir = line.split()

            if not tile.startswith('CMT_TOP'):
                continue

            if 'UPPER_B' in tile:
                continue
            if 'LOWER_T' in tile:
                continue

            pip_prefix, _ = pip.split(".")
            tile_from_pip, tile_type = pip_prefix.split('/')
            assert tile == tile_from_pip
            _, src = src.split("/")
            _, dst = dst.split("/")
            pnum = int(pnum)
            pdir = int(pdir)

            if tile not in tiledata:
                tiledata[tile] = {
                    "type": tile_type,
                    "pips": set(),
                    "srcs": set(),
                    "dsts": set(),
                }

            tiledata[tile]["pips"].add((src, dst))
            tiledata[tile]["srcs"].add(src)
            tiledata[tile]["dsts"].add(dst)

            if pdir == 0:
                tiledata[tile]["srcs"].add(dst)
                tiledata[tile]["dsts"].add(src)

            #if dst.startswith('CMT_TOP_R_LOWER_B_CLK') or \
            #   dst.startswith('CMT_TOP_L_LOWER_B_CLK'):
            #    ignpip.add((src, dst))

    active_wires = {}
    with open("design_wires.txt", "r") as f:
        for l in f:
            tile, wire = l.strip().split('/')

            if tile not in active_wires:
                active_wires[tile] = set()

            active_wires[tile].add(wire)

    tags = {}

    # Populate IN_USE tags
    for tile, (site, in_use) in designdata.items():
        if tile not in tags:
            tags[tile] = {}

        tile_type = tile.rsplit("_", maxsplit=1)[0]
        tags[tile]["IN_USE"] = int(in_use)

    # Populate PIPs
    active_clks = {}
    for tile in tags.keys():
        tile_type = tile.rsplit("_", maxsplit=1)[0]

        in_use = tags[tile]["IN_USE"]

        if not in_use:
            active_pips = []
        else:
            active_pips = tiledata[tile]["pips"]

        for src, dst in pipdata[tile_type]:

            if (src, dst) in ignpip:
                continue
            if (src, dst) in ppipdata[tile_type]:
                continue

            tag = "{}.{}".format(merge_lr_wires(dst), merge_lr_wires(src))
            val = in_use if (src, dst) in active_pips else False

            if not (in_use and not val):
                if tile not in active_clks:
                    active_clks[tile] = set()

                active_clks[tile].add(src)
                tags[tile][tag] = int(val)

        for wire in wiredata[tile_type]:
            if 'CLK' not in wire:
                continue

            if 'CLKOUT' in wire:
                continue

            if 'CLKFB' in wire:
                continue

            if 'REBUF' in wire:
                continue

            wire = merge_lr_wires(wire)

            if tile not in active_wires:
                active_wires[tile] = set()
            segmk.add_tile_tag(
                tile, '{}_ACTIVE'.format(wire), wire in active_wires[tile])

    # Output tags
    for tile, tile_tags in tags.items():
        for t, v in tile_tags.items():
            segmk.add_tile_tag(tile, t, v)

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #18
0
def run():
    segmk = Segmaker("design.bits", verbose=True)

    print("Loading tags")
    with open('params.json', 'r') as fp:
        data = json.load(fp)

    used_dsps = set()

    for params in data['instances']:
        dsp = "DSP_0" if params['SITE'][-1] in "02468" else "DSP_1"
        site = params['SITE']

        if params['USE_DPORT'] == quote(
                "TRUE") and params['USE_MULT'] != quote("NONE"):
            add(segmk, site, dsp, 'ADREG', 0, to_int(params['ADREG']), 1)
        add(segmk, site, dsp, 'ALUMODEREG', 0, to_int(params['ALUMODEREG']), 1)

        if params['A_INPUT'] == quote("DIRECT"):
            add(segmk, site, dsp, 'AREG_0', 0,
                int(to_int(params['AREG']) == 0), 0, False)
            add(segmk, site, dsp, 'AREG_2', 0,
                int(to_int(params['AREG']) == 2), 0, False)

        if params['B_INPUT'] == quote("DIRECT"):
            add(segmk, site, dsp, 'BREG_0', 0,
                int(to_int(params['BREG']) == 0), 0, False)
            add(segmk, site, dsp, 'BREG_2', 0,
                int(to_int(params['BREG']) == 2), 0, False)

        if params['A_INPUT'] == quote("CASCADE"):
            add(
                segmk, site, dsp, 'AREG_2_ACASCREG_1', 0,
                int(
                    to_int(params['AREG']) == 2
                    and to_int(params['ACASCREG']) == 1), 0, False)
            add(
                segmk, site, dsp, 'AREG_2_ACASCREG_1', 0,
                int(
                    to_int(params['AREG']) == 2
                    and to_int(params['ACASCREG']) == 1), 1, False)

        if params['B_INPUT'] == quote("CASCADE"):
            add(
                segmk, site, dsp, 'BREG_2_BCASCREG_1', 0,
                int(
                    to_int(params['BREG']) == 2
                    and to_int(params['BCASCREG']) == 1), 0, False)
            add(
                segmk, site, dsp, 'BREG_2_BCASCREG_1', 0,
                int(
                    to_int(params['BREG']) == 2
                    and to_int(params['BCASCREG']) == 1), 1, False)

        add(segmk, site, dsp, 'CARRYINREG', 0, to_int(params['CARRYINREG']), 1)
        add(segmk, site, dsp, 'CARRYINSELREG', 0,
            to_int(params['CARRYINSELREG']), 1)
        add(segmk, site, dsp, 'CREG', 0, to_int(params['CREG']), 1)
        if params['USE_DPORT'] == quote(
                "TRUE") and params['USE_MULT'] != quote("NONE"):
            add(segmk, site, dsp, 'DREG', 0, to_int(params['DREG']), 1)
        add(segmk, site, dsp, 'INMODEREG', 0, to_int(params['INMODEREG']), 1)
        add(segmk, site, dsp, 'OPMODEREG', 0, to_int(params['OPMODEREG']), 1)
        add(segmk, site, dsp, 'PREG', 0, to_int(params['PREG']), 1)

        INPUT = {}
        INPUT[quote('DIRECT')] = 0
        INPUT[quote('CASCADE')] = 1

        add(segmk, site, dsp, 'A_INPUT', 0, INPUT[params['A_INPUT']], 0)
        add(segmk, site, dsp, 'B_INPUT', 0, INPUT[params['B_INPUT']], 0)

        BOOL = {}
        BOOL[quote('FALSE')] = 0
        BOOL[quote('TRUE')] = 1

        add(segmk, site, dsp, 'USE_DPORT', 0, BOOL[params['USE_DPORT']], 0)

        add(segmk, site, dsp, 'USE_SIMD_FOUR12', 0,
            params['USE_SIMD'] == quote("FOUR12"), 0, False)
        add(segmk, site, dsp, 'USE_SIMD_FOUR12_TWO24', 0, params['USE_SIMD']
            in (quote("TWO24"), quote("FOUR12")), 0, False)

        MULT = {}
        MULT[quote('NONE')] = 0
        MULT[quote('MULTIPLY')] = 1
        MULT[quote('DYNAMIC')] = 2

        for i in range(2):
            add(segmk, site, dsp, 'USE_MULT', i, MULT[params['USE_MULT']], 0)

        add(segmk, site, dsp, 'MREG', 0, to_int(params['MREG']), 1)

        AUTORESET = {}
        AUTORESET[quote('NO_RESET')] = 0
        AUTORESET[quote('RESET_NOT_MATCH')] = 1
        AUTORESET[quote('RESET_MATCH')] = 2

        add(segmk, site, dsp, 'AUTORESET_PATDET_RESET_NOT_MATCH', 0,
            params['AUTORESET_PATDET'] == quote("RESET_NOT_MATCH"), 0, False)
        add(
            segmk, site, dsp, 'AUTORESET_PATDET_RESET', 0,
            params['AUTORESET_PATDET']
            in (quote("RESET_NOT_MATCH"), quote("RESET_MATCH")), 0, False)

        for i in range(48):
            add(segmk, site, dsp, 'MASK', i, to_int(params['MASK']), 0)

        for i in range(48):
            add(segmk, site, dsp, 'PATTERN', i, to_int(params['PATTERN']), 0)

        if params['USE_PATTERN_DETECT'] == quote("PATDET"):
            add_site_group_zero(segmk, site, dsp + ".", [
                "SEL_MASK_%s" % x
                for x in ["MASK", "C", "ROUNDING_MODE1", "ROUNDING_MODE2"]
            ], "SEL_MASK_MASK", "SEL_MASK_%s" % (params['SEL_MASK'][1:-1]))

        USE_PATTERN_DETECT = {}
        USE_PATTERN_DETECT[quote('NO_PATDET')] = 0
        USE_PATTERN_DETECT[quote('PATDET')] = 1

        add(segmk, site, dsp, 'USE_PATTERN_DETECT', 0,
            USE_PATTERN_DETECT[params['USE_PATTERN_DETECT']], 0)

        inv_ports = [
            ("ALUMODE", 4),
            ("CARRYIN", 1),
            ("CLK", 1),
            ("INMODE", 5),
            ("OPMODE", 7),
        ]

        for port, width in inv_ports:
            param = 'IS_{}_INVERTED'.format(port)
            for i in range(width):
                add(segmk, site, dsp, param, i, to_int(params[param]), 1,
                    width > 1)

    segmk.compile()
    segmk.write()
Exemple #19
0
#!/usr/bin/env python3

import sys, os, re

from prjxray.segmaker import Segmaker

segmk = Segmaker("design_%s.bits" % sys.argv[1])

pipdata = dict()
ignpip = set()

print("Loading tags from design.txt.")
with open("design_%s.txt" % sys.argv[1], "r") as f:
    for line in f:
        tile, loc, mask, pattern = line.split()
        dsp = "DSP_0" if loc[-1] in "02468" else "DSP_1"

        mask = int(mask.replace("48'h", ""), 16)
        pattern = int(pattern.replace("48'h", ""), 16)

        for i in range(48):
            segmk.add_tile_tag(tile, "%s.MASK[%d]" % (dsp, i), (mask >> i) & 1)
            segmk.add_tile_tag(tile, "%s.PATTERN[%d]" % (dsp, i),
                               (pattern >> i) & 1)

segmk.compile()
segmk.write(suffix=sys.argv[1])
Exemple #20
0
#!/usr/bin/env python3

import os

from prjxray.segmaker import Segmaker

segmk = Segmaker("design.bits")

tiledata = dict()
pipdata = set()

print("Loading tags from design.txt.")
with open("design.txt", "r") as f:
    for line in f:
        ab, dst, src = line.split()
        tile, dst = dst.split("/")
        _, src = src.split("/")

        if tile not in tiledata:
            tiledata[tile] = {
                "pips": set(),
                "nodes": set(),
            }

        if ab == "A":
            tiledata[tile]["pips"].add((dst, src))
            pipdata.add((dst, src))
        else:
            tiledata[tile]["nodes"].add(src)
            tiledata[tile]["nodes"].add(dst)
Exemple #21
0
#!/usr/bin/env python3

import sys, re

from prjxray.segmaker import Segmaker

segmk = Segmaker("design.bits")

tiledata = dict()
pipdata = dict()
ignpip = set()

print("Loading tags from design.txt.")
with open("design.txt", "r") as f:
    for line in f:
        tile, pip, src, dst, pnum, pdir = line.split()
        _, pip = pip.split(".")
        _, src = src.split("/")
        _, dst = dst.split("/")
        pnum = int(pnum)
        pdir = int(pdir)

        if tile not in tiledata:
            tiledata[tile] = {"pips": set(), "srcs": set(), "dsts": set()}

        if pip in pipdata:
            assert pipdata[pip] == (src, dst)
        else:
            pipdata[pip] = (src, dst)

        tiledata[tile]["pips"].add(pip)
Exemple #22
0
#!/usr/bin/env python3

from prjxray.segmaker import Segmaker
from prjxray import util

segmk = Segmaker("design.bits")
cache = dict()

print("Loading tags")
'''
module,loc,n
clb_NFFMUX_O5,SLICE_X12Y100,3
clb_NFFMUX_AX,SLICE_X13Y100,2
clb_NFFMUX_O6,SLICE_X14Y100,3
'''
f = open('params.csv', 'r')
f.readline()
for l in f:
    module, loc, n = l.split(',')
    n = int(n)
    which = chr(ord('A') + n)
    # clb_NFFMUX_AX => AX
    src = module.replace('clb_NFFMUX_', '')
    '''
    AFFMUX
            30_00   30_01   30_02   30_03
    F78     1       1
    CY      1               1
    O5      1                       1
    AX              1
    XOR                     1
Exemple #23
0
for arg in sys.argv[1:]:
    with open(arg + ".txt", "r") as f:
        for line in f:
            tile, pip = line.split()
            _, pip = pip.split("/")
            tile_type, pip = pip.split(".")
            src, dst = pip.split("->>")
            tag = "%s.%s" % (dst, src)
            tags[tag] = dst
            if "HCLK_CK_BUFH" in src:
                en_tag = "ENABLE_BUFFER.%s" % src
                en_tags[en_tag] = src

for arg in sys.argv[1:]:
    print("Processing %s." % arg)
    segmk = Segmaker(arg + ".bits")

    tiledata = dict()
    pipdata = dict()
    ignpip = set()

    with open(arg + ".txt", "r") as f:
        for line in f:
            tile, pip = line.split()
            _, pip = pip.split("/")
            tile_type, pip = pip.split(".")
            src, dst = pip.split("->>")

            # FIXME: workaround for https://github.com/SymbiFlow/prjxray/issues/392
            if "CLB_IO_CLK" not in segmk.grid[tile]["bits"]:
                print("WARNING: dropping tile %s" % tile)
Exemple #24
0
parser.add_argument('--todo',
                    action='store',
                    default='../../todo.txt',
                    help='todo file path')
parser.add_argument('--design',
                    action='store',
                    default='design.txt',
                    help='design description file path')
parser.add_argument('--verbose', action='store_true', help='')
parser.add_argument('--bits',
                    action='store',
                    default='design.bits',
                    help='bits file path')

args = parser.parse_args()
segmk = Segmaker(args.bits)

verbose = args.verbose

tiledata = dict()
pipdata = dict()
ignpip = set()
todo = set()

print("Loading todo from %s." % args.todo)
with open(args.todo, "r") as f:
    for line in f:
        line = tuple(line.strip().split("."))
        verbose and print('todo', line)
        todo.add(line)
Exemple #25
0
def main():
    segmk = Segmaker("design.bits")

    print("Loading tags")
    with open('params.json') as f:
        params = json.load(f)

    for row in params:
        base_name = 'BUFHCE_X{}Y{}'.format(row['x'], row['y'])

        segmk.add_site_tag(row['site'], '{}.IN_USE'.format(base_name),
                           row['IN_USE'])
        if not row['IN_USE']:
            continue

        segmk.add_site_tag(row['site'], '{}.INIT_OUT'.format(base_name),
                           row['INIT_OUT'])

        segmk.add_site_tag(row['site'], '{}.ZINV_CE'.format(base_name),
                           1 ^ row['IS_CE_INVERTED'])

        # SYNC is a zero pattern
        for opt in ['ASYNC']:
            segmk.add_site_tag(row['site'],
                               '{}.CE_TYPE.'.format(base_name) + opt,
                               verilog.unquote(row['CE_TYPE']) == opt)

    segmk.compile()
    segmk.write()
Exemple #26
0
#!/usr/bin/env python3

from prjxray.segmaker import Segmaker
from prjxray import util

segmk = Segmaker("design.bits")
cache = dict()

print("Loading tags")
'''
module,loc,n
clb_NFFMUX_O5,SLICE_X12Y100,3
clb_NFFMUX_AX,SLICE_X13Y100,2
clb_NFFMUX_O6,SLICE_X14Y100,3
'''
f = open('params.csv', 'r')
f.readline()
for l in f:
    module, loc, n = l.split(',')
    n = int(n)
    which = chr(ord('A') + n)
    # clb_NFFMUX_AX => AX
    src = module.replace('clb_NOUTMUX_', '')
    '''
    BOUTMUX
            30_20   30_21    30_22   30_23
    O6      1
    O5      1               1
    XOR             1
    CY              1       1
    F8                      1       1
Exemple #27
0
def main():
    print("Loading tags")
    segmk = Segmaker("design.bits")
    '''
    port,site,tile,pin,slew,drive,pulltype
    di[0],IOB_X0Y107,LIOB33_X0Y107,A21,PULLDOWN
    di[10],IOB_X0Y147,LIOB33_X0Y147,F14,PULLUP
    '''
    with open('params.jl', 'r') as f:
        design = json.load(f)

        for d in design:
            site = d['site']

            if skip_broken_tiles(d):
                continue

            iostandard = verilog.unquote(d['IOSTANDARD'])

            stepdown = iostandard in STEPDOWN_IOSTANDARDS
            segmk.add_site_tag(site, '_'.join(STEPDOWN_IOSTANDARDS), stepdown)

            if d['type'] is None:
                segmk.add_site_tag(site, 'INOUT', 0)
                segmk.add_site_tag(site, '{}.IN_USE'.format(iostandard), 0)
                segmk.add_site_tag(site, '{}.IN'.format(iostandard), 0)
                segmk.add_site_tag(site, '{}.OUT'.format(iostandard), 0)
                for drive in drives_for_iostandard(iostandard):
                    segmk.add_site_tag(
                        site,
                        '{}.DRIVE.I{}.IN_OUT_COMMON'.format(iostandard,
                                                            drive), 0)
            elif d['type'] == 'IBUF':
                segmk.add_site_tag(site, 'INOUT', 0)
                segmk.add_site_tag(site, '{}.IN_USE'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.IN'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.OUT'.format(iostandard), 0)
                for drive in drives_for_iostandard(iostandard):
                    segmk.add_site_tag(
                        site,
                        '{}.DRIVE.I{}.IN_OUT_COMMON'.format(iostandard,
                                                            drive), 1)
            elif d['type'] == 'OBUF':
                segmk.add_site_tag(site, 'INOUT', 0)
                segmk.add_site_tag(site, '{}.IN_USE'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.IN'.format(iostandard), 0)
                segmk.add_site_tag(site, '{}.OUT'.format(iostandard), 1)
                for drive in drives_for_iostandard(iostandard):
                    if drive == d['DRIVE']:
                        segmk.add_site_tag(
                            site, '{}.DRIVE.I{}.IN_OUT_COMMON'.format(
                                iostandard, drive), 1)
                    else:
                        segmk.add_site_tag(
                            site, '{}.DRIVE.I{}.IN_OUT_COMMON'.format(
                                iostandard, drive), 0)
            elif d['type'] == 'IOBUF_INTERMDISABLE':
                segmk.add_site_tag(site, 'INOUT', 1)
                segmk.add_site_tag(site, '{}.IN_USE'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.OUT'.format(iostandard), 1)

            if d['type'] is not None:
                segmaker.add_site_group_zero(
                    segmk, site, "PULLTYPE.",
                    ("NONE", "KEEPER", "PULLDOWN", "PULLUP"), "PULLDOWN",
                    verilog.unquote(d['PULLTYPE']))

            if d['type'] == 'IBUF' or d['type'] is None:
                continue

            drive_opts = set()
            for opt in ("LVCMOS25", "LVCMOS33", "LVCMOS18", "LVCMOS15",
                        "LVCMOS12", 'LVTTL'):
                for drive_opt in ("4", "8", "12", "16", "24"):
                    if drive_opt == "16" and opt == "LVCMOS12":
                        continue

                    if drive_opt == "24" and opt not in ["LVCMOS18", 'LVTTL']:
                        continue

                    drive_opts.add(mk_drive_opt(opt, drive_opt))

            segmaker.add_site_group_zero(segmk, site, '', drive_opts,
                                         mk_drive_opt('LVCMOS25', '12'),
                                         mk_drive_opt(iostandard, d['DRIVE']))

            segmaker.add_site_group_zero(segmk, site, "SLEW.",
                                         ("SLOW", "FAST"), "FAST",
                                         verilog.unquote(d['SLEW']))

            if 'ibufdisable_wire' in d:
                segmk.add_site_tag(site, 'IBUFDISABLE.I',
                                   d['ibufdisable_wire'] != '0')

            if 'intermdisable_wire' in d:
                segmk.add_site_tag(site, 'INTERMDISABLE.I',
                                   d['intermdisable_wire'] != '0')

    segmk.compile(bitfilter=bitfilter)
    segmk.write(allow_empty=True)
Exemple #28
0
def run():
    segmk = Segmaker("design.bits", verbose=True)

    print("Loading tags")
    with open('params.json', 'r') as fp:
        data = json.load(fp)

    for params in data['instances']:
        dsp = "DSP_0" if params['SITE'][-1] in "02468" else "DSP_1"
        site = params['SITE']

        add(segmk, site, dsp, 'ADREG', 0, to_int(params['ADREG']), 0)
        add(segmk, site, dsp, 'ALUMODEREG', 0, to_int(params['ALUMODEREG']), 1)

        for i in range(2):
            add(segmk, site, dsp, 'AREG', i, to_int(params['AREG']), 1)

        for i in range(2):
            add(segmk, site, dsp, 'ACASCREG', i, to_int(params['ACASCREG']), 1)

        for i in range(2):
            add(segmk, site, dsp, 'BREG', i, to_int(params['BREG']), 1)

        for i in range(2):
            add(segmk, site, dsp, 'BCASCREG', i, to_int(params['BCASCREG']), 1)

        add(segmk, site, dsp, 'CARRYINREG', 0, to_int(params['CARRYINREG']), 1)
        add(
            segmk, site, dsp, 'CARRYINSELREG', 0,
            to_int(params['CARRYINSELREG']), 1)
        add(segmk, site, dsp, 'CREG', 0, to_int(params['CREG']), 1)

        add(segmk, site, dsp, 'DREG', 0, to_int(params['DREG']), 0)
        add(segmk, site, dsp, 'INMODEREG', 0, to_int(params['INMODEREG']), 1)
        add(segmk, site, dsp, 'OPMODEREG', 0, to_int(params['OPMODEREG']), 1)
        add(segmk, site, dsp, 'PREG', 0, to_int(params['PREG']), 1)

        INPUT = {}
        INPUT[quote('DIRECT')] = 0
        INPUT[quote('CASCADE')] = 1

        add(segmk, site, dsp, 'A_INPUT', 0, INPUT[params['A_INPUT']], 0)
        add(segmk, site, dsp, 'B_INPUT', 0, INPUT[params['B_INPUT']], 0)

        BOOL = {}
        BOOL[quote('FALSE')] = 0
        BOOL[quote('TRUE')] = 1

        add(segmk, site, dsp, 'USE_DPORT', 0, BOOL[params['USE_DPORT']], 0)

        SIMD = {}
        SIMD[quote('ONE48')] = 0
        SIMD[quote('TWO24')] = 1
        SIMD[quote('FOUR12')] = 2

        for i in range(2):
            add(segmk, site, dsp, 'USE_SIMD', i, SIMD[params['USE_SIMD']], 0)

        MULT = {}
        MULT[quote('NONE')] = 0
        MULT[quote('MULTIPLY')] = 1
        MULT[quote('DYNAMIC')] = 2

        for i in range(2):
            add(segmk, site, dsp, 'USE_MULT', i, MULT[params['USE_MULT']], 0)

        add(segmk, site, dsp, 'MREG', 0, to_int(params['MREG']), 1)

        AUTORESET = {}
        AUTORESET[quote('NO_RESET')] = 0
        AUTORESET[quote('RESET_NOT_MATCH')] = 1
        AUTORESET[quote('RESET_MATCH')] = 2

        add(
            segmk, site, dsp, 'AUTORESET_PATDET', 0,
            AUTORESET[params['AUTORESET_PATDET']], 0)
        add(
            segmk, site, dsp, 'AUTORESET_PATDET', 1,
            AUTORESET[params['AUTORESET_PATDET']], 1)

        for i in range(48):
            add(segmk, site, dsp, 'MASK', i, to_int(params['MASK']), 0)

        for i in range(48):
            add(segmk, site, dsp, 'PATTERN', i, to_int(params['PATTERN']), 0)

        SEL_MASK = {}
        SEL_MASK[quote('MASK')] = 0
        SEL_MASK[quote('C')] = 1
        SEL_MASK[quote('ROUNDING_MODE1')] = 2
        SEL_MASK[quote('ROUNDING_MODE2')] = 3

        for i in range(2):
            add(
                segmk, site, dsp, 'SEL_MASK', i, SEL_MASK[params['SEL_MASK']],
                0)

        USE_PATTERN_DETECT = {}
        USE_PATTERN_DETECT[quote('NO_PATDET')] = 0
        USE_PATTERN_DETECT[quote('PATDET')] = 1

        add(
            segmk, site, dsp, 'USE_PATTERN_DETECT', 0,
            USE_PATTERN_DETECT[params['USE_PATTERN_DETECT']], 0)

    segmk.compile()
    segmk.write()
Exemple #29
0
def main():
    segmk = Segmaker("design.bits")

    designdata = {}
    tiledata = {}
    pipdata = {}
    ppipdata = {}
    ignpip = set()

    piplists = ['cmt_top_l_upper_t.txt', 'cmt_top_r_upper_t.txt']
    ppiplists = ['ppips_cmt_top_l_upper_t.db', 'ppips_cmt_top_r_upper_t.db']

    # Load PIP lists
    print("Loading PIP lists...")
    for piplist in piplists:
        with open(
                os.path.join(os.getenv('FUZDIR'), '..', 'piplist', 'build',
                             'cmt_top', piplist)) as f:
            for l in f:
                tile_type, dst, src = l.strip().split('.')
                if tile_type not in pipdata:
                    pipdata[tile_type] = []

                pipdata[tile_type].append((src, dst))

    # Load PPIP lists (to exclude them)
    print("Loading PPIP lists...")
    for ppiplist in ppiplists:
        fname = os.path.join(os.getenv('FUZDIR'), '..', '071-ppips', 'build',
                             ppiplist)
        with open(fname, 'r') as f:
            for l in f:
                pip_data, pip_type = l.strip().split()

                if pip_type != 'always':
                    continue

                tile_type, dst, src = pip_data.split('.')
                if tile_type not in ppipdata:
                    ppipdata[tile_type] = []

                ppipdata[tile_type].append((src, dst))

    # Load desgin data
    print("Loading design data...")
    with open("design.txt", "r") as f:
        for line in f:
            fields = line.strip().split(",")
            designdata[fields[0]] = fields[1:]

    with open("design_pips.txt", "r") as f:
        for line in f:
            tile, pip, src, dst, pnum, pdir = line.split()

            if not tile.startswith('CMT_TOP'):
                continue

            if 'UPPER_B' in tile:
                continue
            if 'LOWER_T' in tile:
                continue

            pip_prefix, _ = pip.split(".")
            tile_from_pip, tile_type = pip_prefix.split('/')
            assert tile == tile_from_pip
            _, src = src.split("/")
            _, dst = dst.split("/")
            pnum = int(pnum)
            pdir = int(pdir)

            if tile not in tiledata:
                tiledata[tile] = {
                    "type": tile_type,
                    "pips": set(),
                    "srcs": set(),
                    "dsts": set(),
                }

            tiledata[tile]["pips"].add((src, dst))
            tiledata[tile]["srcs"].add(src)
            tiledata[tile]["dsts"].add(dst)

            if pdir == 0:
                tiledata[tile]["srcs"].add(dst)
                tiledata[tile]["dsts"].add(src)

            if dst.startswith('CMT_TOP_R_UPPER_T_CLK') or \
               dst.startswith('CMT_TOP_L_UPPER_T_CLK'):
                ignpip.add((src, dst))

    tags = {}

    # Populate IN_USE tags
    for tile, (site, in_use) in designdata.items():
        if tile not in tags:
            tags[tile] = {}

        tags[tile]["IN_USE"] = int(in_use)

    # Populate PIPs
    for tile in tags.keys():
        tile_type = tile.rsplit("_", maxsplit=1)[0]

        in_use = tags[tile]["IN_USE"]
        internal_feedback = False

        if not in_use:
            active_pips = []
        else:
            active_pips = tiledata[tile]["pips"]

        for src, dst in pipdata[tile_type]:

            if (src, dst) in ignpip:
                continue
            if (src, dst) in ppipdata[tile_type]:
                continue

            tag = "{}.{}".format(dst, src)
            val = in_use if (src, dst) in active_pips else False

            if not (in_use and not val):
                tags[tile][tag] = int(val)

    # Output tags
    for tile, tile_tags in tags.items():
        for t, v in tile_tags.items():
            segmk.add_tile_tag(tile, t, v)

    segmk.compile(bitfilter=bitfilter)
    segmk.write()
Exemple #30
0
def main():
    # Create map of iobank -> sites
    iobanks = {}
    site_to_iobank = {}
    iobank_iostandards = {}
    with open(os.path.join(os.getenv('FUZDIR'), 'build', 'iobanks.txt')) as f:
        for l in f:
            iob_site, iobank = l.strip().split(',')
            iobank = int(iobank)

            if iobank not in iobanks:
                iobanks[iobank] = set()

            iobanks[iobank].add(iob_site)
            assert iob_site not in site_to_iobank
            site_to_iobank[iob_site] = iobank

    for iobank in iobanks:
        iobank_iostandards[iobank] = set()

    # Load a list of PUDC_B pin function tiles. They are configured differently
    # by the vendor tools so need to be skipped
    pudc_tiles = set()
    with open(os.path.join(os.getenv('FUZDIR'), 'build',
                           'pudc_sites.csv')) as f:
        for l in csv.DictReader(f):
            pudc_tiles.add(l["tile"])

    print("Loading tags")
    segmk = Segmaker("design.bits")
    '''
    port,site,tile,pin,slew,drive,pulltype
    di[0],IOB_X0Y107,LIOB33_X0Y107,A21,PULLDOWN
    di[10],IOB_X0Y147,LIOB33_X0Y147,F14,PULLUP
    '''
    with open('params.json', 'r') as f:
        design = json.load(f)

        diff_pairs = set()
        for d in design['tiles']:
            iostandard = verilog.unquote(d['IOSTANDARD'])
            if iostandard.startswith('DIFF_'):
                diff_pairs.add(d['pair_site'])

        for d in design['tiles']:
            site = d['site']

            if d['tile'] in pudc_tiles:
                continue

            if site in diff_pairs:
                continue

            iostandard = verilog.unquote(d['IOSTANDARD'])
            if iostandard.startswith('DIFF_'):
                iostandard = iostandard[5:]

            iobank_iostandards[site_to_iobank[site]].add(iostandard)

            segmk.add_site_tag(site,
                               '_'.join(STEPDOWN_IOSTANDARDS) + '.STEPDOWN',
                               iostandard in STEPDOWN_IOSTANDARDS)

            if 'IN_TERM' in d:
                segmaker.add_site_group_zero(segmk, site, 'IN_TERM.', [
                    'NONE', 'UNTUNED_SPLIT_40', 'UNTUNED_SPLIT_50',
                    'UNTUNED_SPLIT_60'
                ], 'NONE', d['IN_TERM'])

            if d['type'] is None:
                segmk.add_site_tag(site, 'INOUT', 0)
                segmk.add_site_tag(site, '{}.IN_USE'.format(iostandard), 0)
                segmk.add_site_tag(site, '{}.IN'.format(iostandard), 0)
                segmk.add_site_tag(site, '{}.OUT'.format(iostandard), 0)
                segmk.add_site_tag(site, '{}.IN_ONLY'.format(iostandard), 0)
            elif d['type'] == 'IBUF':
                segmk.add_site_tag(site, 'INOUT', 0)
                segmk.add_site_tag(site, '{}.IN_USE'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.IN'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.IN_DIFF'.format(iostandard), 0)
                segmk.add_site_tag(site, '{}.OUT'.format(iostandard), 0)
                segmk.add_site_tag(site, '{}.IN_ONLY'.format(iostandard), 1)
                segmk.add_tile_tag(d['tile'], 'IN_DIFF', 0)

                if iostandard in IBUF_LOW_PWR_SUPPORTED:
                    segmk.add_site_tag(site, 'IBUF_LOW_PWR', d['IBUF_LOW_PWR'])
                    segmk.add_site_tag(site, 'ZIBUF_LOW_PWR',
                                       1 ^ d['IBUF_LOW_PWR'])
            elif d['type'] == 'IBUFDS':
                segmk.add_site_tag(site, 'INOUT', 0)
                segmk.add_site_tag(site, '{}.IN_USE'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.IN'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.IN_DIFF'.format(iostandard), 1)
                segmk.add_site_tag(d['pair_site'],
                                   '{}.IN_DIFF'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.OUT'.format(iostandard), 0)
                segmk.add_site_tag(site, '{}.IN_ONLY'.format(iostandard), 1)
                segmk.add_tile_tag(d['tile'], 'IN_DIFF', 1)
            elif d['type'] == 'OBUF':
                segmk.add_site_tag(site, 'INOUT', 0)
                segmk.add_site_tag(site, '{}.IN_USE'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.IN'.format(iostandard), 0)
                segmk.add_site_tag(site, '{}.OUT'.format(iostandard), 1)
                segmk.add_tile_tag(d['tile'], 'OUT_DIFF', 0)
            elif d['type'] == 'OBUFDS':
                segmk.add_site_tag(site, 'INOUT', 0)
                segmk.add_site_tag(site, '{}.IN_USE'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.IN'.format(iostandard), 0)
                segmk.add_site_tag(site, '{}.OUT'.format(iostandard), 1)
                segmk.add_tile_tag(d['tile'], 'OUT_DIFF', 1)
                segmk.add_tile_tag(d['tile'], 'OUT_TDIFF', 0)
            elif d['type'] == 'OBUFTDS':
                segmk.add_site_tag(site, 'INOUT', 0)
                segmk.add_site_tag(site, '{}.IN_USE'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.IN'.format(iostandard), 0)
                segmk.add_site_tag(site, '{}.OUT'.format(iostandard), 1)
                segmk.add_tile_tag(d['tile'], 'OUT_DIFF', 1)
                segmk.add_tile_tag(d['tile'], 'OUT_TDIFF', 1)
            elif d['type'] == 'IOBUF_INTERMDISABLE':
                segmk.add_site_tag(site, 'INOUT', 1)
                segmk.add_site_tag(site, '{}.IN_USE'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.IN'.format(iostandard), 1)
                segmk.add_site_tag(site, '{}.OUT'.format(iostandard), 1)

            if d['type'] is not None:
                segmaker.add_site_group_zero(
                    segmk, site, "PULLTYPE.",
                    ("NONE", "KEEPER", "PULLDOWN", "PULLUP"), "PULLDOWN",
                    verilog.unquote(d['PULLTYPE']))

            if d['type'] in [None, 'IBUF', 'IBUFDS']:
                continue

            drive_opts = set()
            for opt in ("LVCMOS25", "LVCMOS33", "LVCMOS18", "LVCMOS15",
                        "LVCMOS12", 'LVTTL'):
                for drive_opt in ("4", "8", "12", "16", "24"):
                    if drive_opt == "16" and opt == "LVCMOS12":
                        continue

                    if drive_opt == "24" and opt not in ["LVCMOS18", 'LVTTL']:
                        continue

                    drive_opts.add(mk_drive_opt(opt, drive_opt))

            drive_opts.add(mk_drive_opt("SSTL135", None))

            segmaker.add_site_group_zero(segmk, site, '', drive_opts,
                                         mk_drive_opt('LVCMOS25', '12'),
                                         mk_drive_opt(iostandard, d['DRIVE']))

            for opt in ["SLOW", "FAST"]:
                segmk.add_site_tag(site, iostandard + ".SLEW." + opt,
                                   opt == verilog.unquote(d['SLEW']))

            if 'ibufdisable_wire' in d:
                segmk.add_site_tag(site, 'IBUFDISABLE.I',
                                   d['ibufdisable_wire'] != '0')

            if 'intermdisable_wire' in d:
                segmk.add_site_tag(site, 'INTERMDISABLE.I',
                                   d['intermdisable_wire'] != '0')

    site_to_cmt = {}
    site_to_tile = {}
    tile_to_cmt = {}
    cmt_to_idelay = {}
    with open(os.path.join(os.getenv('FUZDIR'), 'build',
                           'cmt_regions.csv')) as f:
        for l in f:
            site, tile, cmt = l.strip().split(',')
            site_to_tile[site] = tile

            site_to_cmt[site] = cmt
            tile_to_cmt[tile] = cmt

            # Given IDELAYCTRL's are only located in HCLK_IOI3 tiles, and
            # there is only on HCLK_IOI3 tile per CMT, update
            # CMT -> IDELAYCTRL / tile map.
            if 'IDELAYCTRL' in site:
                assert cmt not in cmt_to_idelay
                cmt_to_idelay[cmt] = site, tile

    # For each IOBANK with an active VREF set the feature
    cmt_vref_active = set()
    with open('iobank_vref.csv') as f:
        for l in f:
            iobank, vref = l.strip().split(',')
            iobank = int(iobank)

            cmt = None
            for cmt_site in iobanks[iobank]:
                if cmt_site in site_to_cmt:
                    cmt = site_to_cmt[cmt_site]
                    break

            if cmt is None:
                continue

            cmt_vref_active.add(cmt)

            _, hclk_cmt_tile = cmt_to_idelay[cmt]

            opt = 'VREF.V_{:d}_MV'.format(int(float(vref) * 1000))
            segmk.add_tile_tag(hclk_cmt_tile, opt, 1)

    for iobank in iobank_iostandards:
        if len(iobank_iostandards[iobank]) == 0:
            continue

        for cmt_site in iobanks[iobank]:
            if cmt_site in site_to_cmt:
                cmt = site_to_cmt[cmt_site]
                break

        if cmt is None:
            continue

        _, hclk_cmt_tile = cmt_to_idelay[cmt]

        assert len(iobank_iostandards[iobank]) == 1, iobank_iostandards[iobank]

        iostandard = list(iobank_iostandards[iobank])[0]
        segmk.add_tile_tag(hclk_cmt_tile, 'STEPDOWN', iostandard
                           in STEPDOWN_IOSTANDARDS)

    # For IOBANK's with no active VREF, clear all VREF options.
    for cmt, (_, hclk_cmt_tile) in cmt_to_idelay.items():
        if cmt in cmt_vref_active:
            continue

        for vref in (
                .600,
                .675,
                .75,
                .90,
        ):
            opt = 'VREF.V_{:d}_MV'.format(int(vref * 1000))
            segmk.add_tile_tag(hclk_cmt_tile, opt, 0)

    segmk.compile(bitfilter=bitfilter)
    segmk.write(allow_empty=True)