mirror of https://github.com/openXC7/prjxray.git
Revert "Autopep8 on all existing sources"
This reverts commit 925885c2cc.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
This commit is contained in:
parent
17985d1934
commit
67c7914a2c
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import sys, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -20,3 +19,4 @@ with open("design.txt", "r") as f:
|
|||
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import json
|
||||
import re
|
||||
import os, json, re
|
||||
|
||||
#################################################
|
||||
# Loading Raw Source Data
|
||||
|
|
@ -57,8 +55,7 @@ with open("carrydata.txt", "r") as f:
|
|||
for i, n in enumerate("CYINIT:ZRO:ONE:AX:CIN DI0:AX:O5 DI1:AX:O5 DI2:AX:O5 DI3:AX:O5".split()):
|
||||
n = n.split(":")
|
||||
for k in n[1:]:
|
||||
carry[line[0]]["CARRY_%s_MUX_%s" %
|
||||
(n[0], k)] = line[1 + i].upper() == k
|
||||
carry[line[0]]["CARRY_%s_MUX_%s" % (n[0], k)] = line[1+i].upper() == k
|
||||
|
||||
|
||||
#################################################
|
||||
|
|
@ -77,11 +74,10 @@ for tilename, tiledata in grid["tiles"].items():
|
|||
if not found_data:
|
||||
continue
|
||||
|
||||
segname = "%s_%02x" % (
|
||||
tiledata["cfgcol"]["BASE_FRAMEID"][2:], min(tiledata["cfgcol"]["WORDS"]))
|
||||
segname = "%s_%02x" % (tiledata["cfgcol"]["BASE_FRAMEID"][2:], min(tiledata["cfgcol"]["WORDS"]))
|
||||
|
||||
if not segname in segments:
|
||||
segments[segname] = {"bits": list(), "tags": dict()}
|
||||
segments[segname] = { "bits": list(), "tags": dict() }
|
||||
|
||||
for site in tiledata["sites"]:
|
||||
if site not in luts and site not in carry:
|
||||
|
|
@ -102,14 +98,12 @@ for tilename, tiledata in grid["tiles"].items():
|
|||
if re.match("^CLBL[LM]_[LR]", tile_type) and "LUT.INIT" in name:
|
||||
tile_type = "CLBLX_X"
|
||||
|
||||
segments[segname]["tags"]["%s.%s.%s" %
|
||||
(tile_type, sitekey, name)] = value
|
||||
segments[segname]["tags"]["%s.%s.%s" % (tile_type, sitekey, name)] = value
|
||||
|
||||
if site in carry:
|
||||
for name, value in carry[site].items():
|
||||
tile_type = tiledata["props"]["TYPE"]
|
||||
segments[segname]["tags"]["%s.%s.%s" %
|
||||
(tile_type, sitekey, name)] = value
|
||||
segments[segname]["tags"]["%s.%s.%s" % (tile_type, sitekey, name)] = value
|
||||
|
||||
base_frame = int(tiledata["cfgcol"]["BASE_FRAMEID"][2:], 16)
|
||||
for wordidx in tiledata["cfgcol"]["WORDS"]:
|
||||
|
|
@ -118,8 +112,7 @@ for tilename, tiledata in grid["tiles"].items():
|
|||
if wordidx not in bits[base_frame]:
|
||||
continue
|
||||
for bit_frame, bit_wordidx, bit_bitidx in bits[base_frame][wordidx]:
|
||||
segments[segname]["bits"].append("%02x_%02x_%02x" % (
|
||||
bit_frame - base_frame, bit_wordidx - min(tiledata["cfgcol"]["WORDS"]), bit_bitidx))
|
||||
segments[segname]["bits"].append("%02x_%02x_%02x" % (bit_frame - base_frame, bit_wordidx - min(tiledata["cfgcol"]["WORDS"]), bit_bitidx))
|
||||
|
||||
segments[segname]["bits"].sort()
|
||||
|
||||
|
|
@ -136,3 +129,4 @@ with open("segdata.txt", "w") as f:
|
|||
print("bit %s" % bitname, file=f)
|
||||
for tagname, tagval in sorted(segdata["tags"].items()):
|
||||
print("tag %s %d" % (tagname, tagval), file=f)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import sys, os, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -62,3 +60,4 @@ for tile, pips_srcs_dsts in tiledata.items():
|
|||
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
import os, re
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
todos = set()
|
||||
|
|
@ -18,8 +16,6 @@ def maketodo(pipfile, dbfile):
|
|||
if line.endswith(".GND_WIRE") or line.endswith(".VCC_WIRE"):
|
||||
print(line)
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import sys, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -9,7 +8,6 @@ from segmaker import segmaker
|
|||
pipdata = dict()
|
||||
ignpip = set()
|
||||
|
||||
|
||||
def handle_design(prefix, second_pass):
|
||||
segmk = segmaker(prefix + ".bits")
|
||||
|
||||
|
|
@ -75,7 +73,6 @@ def handle_design(prefix, second_pass):
|
|||
segmk.compile()
|
||||
segmk.write(prefix[7:])
|
||||
|
||||
|
||||
for arg in sys.argv[1:]:
|
||||
prefix = arg[0:-4]
|
||||
handle_design(prefix, False)
|
||||
|
|
@ -83,3 +80,4 @@ for arg in sys.argv[1:]:
|
|||
for arg in sys.argv[1:]:
|
||||
prefix = arg[0:-4]
|
||||
handle_design(prefix, True)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
import os, re
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
todos = set()
|
||||
|
|
@ -23,8 +21,6 @@ def maketodo(pipfile, dbfile):
|
|||
continue
|
||||
print(line)
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import re
|
||||
import os, sys, json, re
|
||||
|
||||
|
||||
#######################################
|
||||
|
|
@ -21,7 +18,7 @@ for arg in sys.argv[1:]:
|
|||
with open(arg) as f:
|
||||
line = f.read().strip()
|
||||
site = arg[7:-6]
|
||||
frame = int(line[5:5 + 8], 16)
|
||||
frame = int(line[5:5+8], 16)
|
||||
site_baseaddr[site] = "0x%08x" % (frame & ~0x7f)
|
||||
|
||||
|
||||
|
|
@ -48,7 +45,7 @@ for record in tiles:
|
|||
|
||||
if len(record) > 4:
|
||||
for i in range(4, len(record), 2):
|
||||
site_type, site_name = record[i:i + 2]
|
||||
site_type, site_name = record[i:i+2]
|
||||
if site_name in site_baseaddr:
|
||||
framebaseaddr = site_baseaddr[site_name]
|
||||
database["tiles"][tile_name]["sites"][site_name] = site_type
|
||||
|
|
@ -67,16 +64,15 @@ for tile_name, tile_data in database["tiles"].items():
|
|||
|
||||
if tile_type in ["CLBLL_L", "CLBLL_R", "CLBLM_L", "CLBLM_R"]:
|
||||
if tile_type in ["CLBLL_L", "CLBLM_L"]:
|
||||
int_tile_name = tiles_by_grid[(grid_x + 1, grid_y)]
|
||||
int_tile_name = tiles_by_grid[(grid_x+1, grid_y)]
|
||||
else:
|
||||
int_tile_name = tiles_by_grid[(grid_x - 1, grid_y)]
|
||||
int_tile_name = tiles_by_grid[(grid_x-1, grid_y)]
|
||||
|
||||
segment_name = "SEG_" + tile_name
|
||||
segtype = tile_type.lower()
|
||||
|
||||
database["segments"][segment_name] = dict()
|
||||
database["segments"][segment_name]["tiles"] = [
|
||||
tile_name, int_tile_name]
|
||||
database["segments"][segment_name]["tiles"] = [tile_name, int_tile_name]
|
||||
database["segments"][segment_name]["type"] = segtype
|
||||
database["segments"][segment_name]["frames"] = 36
|
||||
database["segments"][segment_name]["words"] = 2
|
||||
|
|
@ -101,11 +97,11 @@ for tile_name, tile_data in database["tiles"].items():
|
|||
if tile_type in ["BRAM_L", "DSP_L", "BRAM_R", "DSP_R"]:
|
||||
for k in range(5):
|
||||
if tile_type in ["BRAM_L", "DSP_L"]:
|
||||
interface_tile_name = tiles_by_grid[(grid_x + 1, grid_y - k)]
|
||||
int_tile_name = tiles_by_grid[(grid_x + 2, grid_y - k)]
|
||||
interface_tile_name = tiles_by_grid[(grid_x+1, grid_y-k)]
|
||||
int_tile_name = tiles_by_grid[(grid_x+2, grid_y-k)]
|
||||
else:
|
||||
interface_tile_name = tiles_by_grid[(grid_x - 1, grid_y - k)]
|
||||
int_tile_name = tiles_by_grid[(grid_x - 2, grid_y - k)]
|
||||
interface_tile_name = tiles_by_grid[(grid_x-1, grid_y-k)]
|
||||
int_tile_name = tiles_by_grid[(grid_x-2, grid_y-k)]
|
||||
|
||||
segment_name = "SEG_" + tile_name.replace("_", "%d_" % k, 1)
|
||||
segtype = tile_type.lower().replace("_", "%d_" % k, 1)
|
||||
|
|
@ -116,14 +112,12 @@ for tile_name, tile_data in database["tiles"].items():
|
|||
database["segments"][segment_name]["words"] = 2
|
||||
|
||||
if k == 0:
|
||||
database["segments"][segment_name]["tiles"] = [
|
||||
tile_name, interface_tile_name, int_tile_name]
|
||||
database["segments"][segment_name]["tiles"] = [tile_name, interface_tile_name, int_tile_name]
|
||||
database["tiles"][tile_name]["segment"] = segment_name
|
||||
database["tiles"][interface_tile_name]["segment"] = segment_name
|
||||
database["tiles"][int_tile_name]["segment"] = segment_name
|
||||
else:
|
||||
database["segments"][segment_name]["tiles"] = [
|
||||
interface_tile_name, int_tile_name]
|
||||
database["segments"][segment_name]["tiles"] = [interface_tile_name, int_tile_name]
|
||||
database["tiles"][interface_tile_name]["segment"] = segment_name
|
||||
database["tiles"][int_tile_name]["segment"] = segment_name
|
||||
|
||||
|
|
@ -134,8 +128,7 @@ for tile_name, tile_data in database["tiles"].items():
|
|||
for segment_name in database["segments"].keys():
|
||||
if "baseaddr" in database["segments"][segment_name]:
|
||||
framebase, wordbase = database["segments"][segment_name]["baseaddr"]
|
||||
inttile = [tile for tile in database["segments"][segment_name]["tiles"]
|
||||
if database["tiles"][tile]["type"] in ["INT_L", "INT_R"]][0]
|
||||
inttile = [tile for tile in database["segments"][segment_name]["tiles"] if database["tiles"][tile]["type"] in ["INT_L", "INT_R"]][0]
|
||||
grid_x = database["tiles"][inttile]["grid_x"]
|
||||
grid_y = database["tiles"][inttile]["grid_y"]
|
||||
|
||||
|
|
@ -163,8 +156,7 @@ for segment_name in database["segments"].keys():
|
|||
seg = database["tiles"][tile]["segment"]
|
||||
|
||||
if "baseaddr" in database["segments"][seg]:
|
||||
assert database["segments"][seg]["baseaddr"] == [
|
||||
framebase, wordbase]
|
||||
assert database["segments"][seg]["baseaddr"] == [framebase, wordbase]
|
||||
else:
|
||||
database["segments"][seg]["baseaddr"] = [framebase, wordbase]
|
||||
|
||||
|
|
@ -180,8 +172,7 @@ for segment_name in database["segments"].keys():
|
|||
|
||||
for segment_name in start_segments:
|
||||
framebase, wordbase = database["segments"][segment_name]["baseaddr"]
|
||||
inttile = [tile for tile in database["segments"][segment_name]["tiles"]
|
||||
if database["tiles"][tile]["type"] in ["INT_L", "INT_R"]][0]
|
||||
inttile = [tile for tile in database["segments"][segment_name]["tiles"] if database["tiles"][tile]["type"] in ["INT_L", "INT_R"]][0]
|
||||
grid_x = database["tiles"][inttile]["grid_x"]
|
||||
grid_y = database["tiles"][inttile]["grid_y"]
|
||||
|
||||
|
|
@ -201,3 +192,4 @@ for segment_name in start_segments:
|
|||
# Write
|
||||
|
||||
print(json.dumps(database, sort_keys=True, indent="\t"))
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import sys, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -23,3 +22,4 @@ with open("design_%s.txt" % sys.argv[1], "r") as f:
|
|||
|
||||
segmk.compile()
|
||||
segmk.write(sys.argv[1])
|
||||
|
||||
|
|
|
|||
|
|
@ -11,25 +11,22 @@ LDPE Primitive: Transparent Data Latch with Asynchronous Preset and Gate Enable
|
|||
|
||||
from prims import *
|
||||
|
||||
import sys
|
||||
import re
|
||||
import sys, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
||||
segmk = segmaker("design.bits")
|
||||
|
||||
|
||||
def ones(l):
|
||||
# return l + [x + '_1' for x in l]
|
||||
# return sorted(l + [x + '_1' for x in l])
|
||||
#return l + [x + '_1' for x in l]
|
||||
#return sorted(l + [x + '_1' for x in l])
|
||||
ret = []
|
||||
for x in l:
|
||||
ret.append(x)
|
||||
ret.append(x + '_1')
|
||||
return ret
|
||||
|
||||
|
||||
def loadtop():
|
||||
'''
|
||||
i,prim,loc,bel
|
||||
|
|
@ -42,20 +39,17 @@ def loadtop():
|
|||
f.readline()
|
||||
ret = {}
|
||||
for l in f:
|
||||
i, prim, loc, bel, init = l.split(",")
|
||||
i,prim,loc,bel,init = l.split(",")
|
||||
i = int(i)
|
||||
init = int(init)
|
||||
ret[loc] = (i, prim, loc, bel, init)
|
||||
ret[loc] = (i,prim,loc,bel,init)
|
||||
return ret
|
||||
|
||||
|
||||
top = loadtop()
|
||||
|
||||
|
||||
def vs2i(s):
|
||||
return {"1'b0": 0, "1'b1": 1}[s]
|
||||
|
||||
|
||||
print("Loading tags from design.txt")
|
||||
with open("design.txt", "r") as f:
|
||||
for line in f:
|
||||
|
|
@ -105,7 +99,7 @@ with open("design.txt", "r") as f:
|
|||
# Synchronous vs asynchronous FF
|
||||
# Unlike most bits, shared between all CLB FFs
|
||||
segmk.addtag(site, "FFSYNC",
|
||||
cel_prim in ('FDSE', 'FDRE'))
|
||||
cel_prim in ('FDSE', 'FDRE'))
|
||||
|
||||
# Latch bit
|
||||
# Only applies to LUT6 (non-5) FF's
|
||||
|
|
@ -119,7 +113,8 @@ with open("design.txt", "r") as f:
|
|||
Z => inversion
|
||||
'''
|
||||
segmk.addtag(site, "%s.ZRST" % ff_name,
|
||||
cel_prim in ('FDRE', 'FDCE', 'LDCE'))
|
||||
cel_prim in ('FDRE', 'FDCE', 'LDCE'))
|
||||
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,67 +1,64 @@
|
|||
def ones(l):
|
||||
# return l + [x + '_1' for x in l]
|
||||
# return sorted(l + [x + '_1' for x in l])
|
||||
#return l + [x + '_1' for x in l]
|
||||
#return sorted(l + [x + '_1' for x in l])
|
||||
ret = []
|
||||
for x in l:
|
||||
ret.append(x)
|
||||
ret.append(x + '_1')
|
||||
return ret
|
||||
|
||||
|
||||
# The complete primitive sets
|
||||
ffprims_fall = ones([
|
||||
'FD',
|
||||
'FDC',
|
||||
'FDCE',
|
||||
'FDE',
|
||||
'FDP',
|
||||
'FDPE',
|
||||
'FDR',
|
||||
'FDRE',
|
||||
'FDS',
|
||||
'FDSE',
|
||||
])
|
||||
'FD',
|
||||
'FDC',
|
||||
'FDCE',
|
||||
'FDE',
|
||||
'FDP',
|
||||
'FDPE',
|
||||
'FDR',
|
||||
'FDRE',
|
||||
'FDS',
|
||||
'FDSE',
|
||||
])
|
||||
ffprims_lall = ones([
|
||||
'LDC',
|
||||
'LDCE',
|
||||
'LDE',
|
||||
'LDPE',
|
||||
'LDP',
|
||||
])
|
||||
'LDC',
|
||||
'LDCE',
|
||||
'LDE',
|
||||
'LDPE',
|
||||
'LDP',
|
||||
])
|
||||
|
||||
# Base primitives
|
||||
ffprims_f = [
|
||||
'FDRE',
|
||||
'FDSE',
|
||||
'FDCE',
|
||||
'FDPE',
|
||||
]
|
||||
'FDRE',
|
||||
'FDSE',
|
||||
'FDCE',
|
||||
'FDPE',
|
||||
]
|
||||
ffprims_l = [
|
||||
'LDCE',
|
||||
'LDPE',
|
||||
]
|
||||
'LDCE',
|
||||
'LDPE',
|
||||
]
|
||||
ffprims = ffprims_f + ffprims_l
|
||||
|
||||
|
||||
def isff(prim):
|
||||
return prim.startswith("FD")
|
||||
|
||||
|
||||
def isl(prim):
|
||||
return prim.startswith("LD")
|
||||
|
||||
|
||||
ff_bels_5 = [
|
||||
'A5FF',
|
||||
'B5FF',
|
||||
'C5FF',
|
||||
'D5FF',
|
||||
]
|
||||
'A5FF',
|
||||
'B5FF',
|
||||
'C5FF',
|
||||
'D5FF',
|
||||
]
|
||||
ff_bels_ffl = [
|
||||
'AFF',
|
||||
'BFF',
|
||||
'CFF',
|
||||
'DFF',
|
||||
]
|
||||
'AFF',
|
||||
'BFF',
|
||||
'CFF',
|
||||
'DFF',
|
||||
]
|
||||
ff_bels = ff_bels_ffl + ff_bels_5
|
||||
#ff_bels = ff_bels_ffl
|
||||
|
||||
|
|
|
|||
|
|
@ -5,17 +5,14 @@ import re
|
|||
|
||||
from prims import *
|
||||
|
||||
|
||||
def slice_xy():
|
||||
'''Return (X1, X2), (Y1, Y2) from XRAY_ROI, exclusive end (for xrange)'''
|
||||
# SLICE_X12Y100:SLICE_X27Y149
|
||||
# Note XRAY_ROI_GRID_* is something else
|
||||
m = re.match(
|
||||
r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
m = re.match(r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
ms = [int(m.group(i + 1)) for i in range(4)]
|
||||
return ((ms[0], ms[2] + 1), (ms[1], ms[3] + 1))
|
||||
|
||||
|
||||
CLBN = 600
|
||||
SLICEX, SLICEY = slice_xy()
|
||||
# 800
|
||||
|
|
@ -28,13 +25,11 @@ print('//Requested CLBs: %s' % str(CLBN))
|
|||
f = open("top.txt", "w")
|
||||
f.write("i,prim,loc,bel,init\n")
|
||||
|
||||
|
||||
def gen_slices():
|
||||
for slicey in range(*SLICEY):
|
||||
for slicex in range(*SLICEX):
|
||||
yield "SLICE_X%dY%d" % (slicex, slicey)
|
||||
|
||||
|
||||
DIN_N = CLBN * 4
|
||||
DOUT_N = CLBN * 1
|
||||
|
||||
|
|
@ -69,8 +64,7 @@ endmodule
|
|||
''' % (DIN_N, DOUT_N))
|
||||
|
||||
slices = gen_slices()
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (
|
||||
DIN_N - 1, DOUT_N - 1))
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (DIN_N - 1, DOUT_N - 1))
|
||||
for i in range(CLBN):
|
||||
ffprim = random.choice(ones(ffprims))
|
||||
# clb_FD clb_FD (.clk(clk), .din(din[ 0 +: 4]), .dout(dout[ 0]));
|
||||
|
|
@ -85,8 +79,7 @@ for i in range(CLBN):
|
|||
#bel = "AFF"
|
||||
print(' clb_%s' % ffprim)
|
||||
print(' #(.LOC("%s"), .BEL("%s"), .INIT(%d))' % (loc, bel, init))
|
||||
print(
|
||||
' clb_%d (.clk(clk), .din(din[ %d +: 4]), .dout(dout[ %d]));' % (i, 4 * i, 1 * i))
|
||||
print(' clb_%d (.clk(clk), .din(din[ %d +: 4]), .dout(dout[ %d]));' % (i, 4 * i, 1 * i))
|
||||
f.write("%d,%s,%s,%s,%d\n" % (i, ffprim, loc, bel, init))
|
||||
print('''endmodule
|
||||
|
||||
|
|
@ -495,3 +488,4 @@ module clb_LDPE_1 (input clk, input [3:0] din, output dout);
|
|||
endmodule
|
||||
|
||||
''')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import sys, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -18,7 +17,7 @@ clb_N5FFMUX,SLICE_X14Y100,3,1
|
|||
f = open('params.csv', 'r')
|
||||
f.readline()
|
||||
for l in f:
|
||||
module, loc, n, def_a = l.split(',')
|
||||
module,loc,n,def_a = l.split(',')
|
||||
def_a = int(def_a)
|
||||
n = int(n)
|
||||
#which = chr(ord('A') + n)
|
||||
|
|
@ -31,3 +30,4 @@ for l in f:
|
|||
segmk.addtag(loc, "%c5FF.MUX.B" % which, 1 ^ def_a ^ inv)
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -3,17 +3,14 @@ random.seed(0)
|
|||
import os
|
||||
import re
|
||||
|
||||
|
||||
def slice_xy():
|
||||
'''Return (X1, X2), (Y1, Y2) from XRAY_ROI, exclusive end (for xrange)'''
|
||||
# SLICE_X12Y100:SLICE_X27Y149
|
||||
# Note XRAY_ROI_GRID_* is something else
|
||||
m = re.match(
|
||||
r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
m = re.match(r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
ms = [int(m.group(i + 1)) for i in range(4)]
|
||||
return ((ms[0], ms[2] + 1), (ms[1], ms[3] + 1))
|
||||
|
||||
|
||||
CLBN = 40
|
||||
SLICEX, SLICEY = slice_xy()
|
||||
# 800
|
||||
|
|
@ -23,13 +20,11 @@ print('//SLICEY: %s' % str(SLICEY))
|
|||
print('//SLICEN: %s' % str(SLICEN))
|
||||
print('//Requested CLBs: %s' % str(CLBN))
|
||||
|
||||
|
||||
def gen_slices():
|
||||
for slicey in range(*SLICEY):
|
||||
for slicex in range(*SLICEX):
|
||||
yield "SLICE_X%dY%d" % (slicex, slicey)
|
||||
|
||||
|
||||
DIN_N = CLBN * 8
|
||||
DOUT_N = CLBN * 8
|
||||
|
||||
|
|
@ -66,8 +61,7 @@ endmodule
|
|||
f = open('params.csv', 'w')
|
||||
f.write('module,loc,n,def_a\n')
|
||||
slices = gen_slices()
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (
|
||||
DIN_N - 1, DOUT_N - 1))
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (DIN_N - 1, DOUT_N - 1))
|
||||
for i in range(CLBN):
|
||||
bel = ''
|
||||
|
||||
|
|
@ -78,8 +72,7 @@ for i in range(CLBN):
|
|||
|
||||
print(' %s' % module)
|
||||
print(' #(.LOC("%s"), .N(%d), .DEF_A(%d))' % (loc, n, def_a))
|
||||
print(
|
||||
' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (i, 8 * i, 8 * i))
|
||||
print(' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (i, 8 * i, 8 * i))
|
||||
|
||||
f.write('%s,%s,%s,%s\n' % (module, loc, n, def_a))
|
||||
f.close()
|
||||
|
|
@ -210,3 +203,4 @@ module clb_N5FFMUX (input clk, input [7:0] din, output [7:0] dout);
|
|||
.D(ffds[0]));
|
||||
endmodule
|
||||
''')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import sys, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -18,7 +17,7 @@ clb_NCY0_O5,SLICE_X17Y100,A6LUT,2
|
|||
f = open('params.csv', 'r')
|
||||
f.readline()
|
||||
for l in f:
|
||||
module, loc, bel, n = l.split(',')
|
||||
module,loc,bel,n = l.split(',')
|
||||
n = int(n)
|
||||
# A, B, etc
|
||||
which = bel[0]
|
||||
|
|
@ -27,3 +26,4 @@ for l in f:
|
|||
segmk.addtag(loc, "CARRY4.%cCY0" % which, module == 'clb_NCY0_O5')
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -3,17 +3,14 @@ random.seed(0)
|
|||
import os
|
||||
import re
|
||||
|
||||
|
||||
def slice_xy():
|
||||
'''Return (X1, X2), (Y1, Y2) from XRAY_ROI, exclusive end (for xrange)'''
|
||||
# SLICE_X12Y100:SLICE_X27Y149
|
||||
# Note XRAY_ROI_GRID_* is something else
|
||||
m = re.match(
|
||||
r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
m = re.match(r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
ms = [int(m.group(i + 1)) for i in range(4)]
|
||||
return ((ms[0], ms[2] + 1), (ms[1], ms[3] + 1))
|
||||
|
||||
|
||||
CLBN = 400
|
||||
SLICEX, SLICEY = slice_xy()
|
||||
# 800
|
||||
|
|
@ -23,13 +20,11 @@ print('//SLICEY: %s' % str(SLICEY))
|
|||
print('//SLICEN: %s' % str(SLICEN))
|
||||
print('//Requested CLBs: %s' % str(CLBN))
|
||||
|
||||
|
||||
def gen_slices():
|
||||
for slicey in range(*SLICEY):
|
||||
for slicex in range(*SLICEX):
|
||||
yield "SLICE_X%dY%d" % (slicex, slicey)
|
||||
|
||||
|
||||
DIN_N = CLBN * 8
|
||||
DOUT_N = CLBN * 8
|
||||
|
||||
|
|
@ -68,8 +63,7 @@ endmodule
|
|||
f = open('params.csv', 'w')
|
||||
f.write('module,loc,bel,n\n')
|
||||
slices = gen_slices()
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (
|
||||
DIN_N - 1, DOUT_N - 1))
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (DIN_N - 1, DOUT_N - 1))
|
||||
for i in range(CLBN):
|
||||
bel = ''
|
||||
|
||||
|
|
@ -83,8 +77,7 @@ for i in range(CLBN):
|
|||
|
||||
print(' %s' % module)
|
||||
print(' #(.LOC("%s"), .BEL("%s"), .N(%d))' % (loc, bel, n))
|
||||
print(
|
||||
' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (i, 8 * i, 8 * i))
|
||||
print(' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (i, 8 * i, 8 * i))
|
||||
|
||||
f.write('%s,%s,%s,%s\n' % (module, loc, bel, n))
|
||||
f.close()
|
||||
|
|
@ -163,3 +156,4 @@ module clb_NCY0_O5 (input clk, input [7:0] din, output [7:0] dout);
|
|||
CARRY4 carry4(.O(o), .CO(), .DI(di), .S(s), .CYINIT(1'b0), .CI());
|
||||
endmodule
|
||||
''')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import sys, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -18,7 +17,7 @@ clb_FDRE,SLICE_X14Y100,1,1
|
|||
f = open('params.csv', 'r')
|
||||
f.readline()
|
||||
for l in f:
|
||||
name, site, ce, r = l.split(',')
|
||||
name,site,ce,r = l.split(',')
|
||||
ce = int(ce)
|
||||
r = int(r)
|
||||
|
||||
|
|
@ -31,3 +30,4 @@ for l in f:
|
|||
segmk.addtag(site, "SRUSEDMUX", r)
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -3,17 +3,14 @@ random.seed(0)
|
|||
import os
|
||||
import re
|
||||
|
||||
|
||||
def slice_xy():
|
||||
'''Return (X1, X2), (Y1, Y2) from XRAY_ROI, exclusive end (for xrange)'''
|
||||
# SLICE_X12Y100:SLICE_X27Y149
|
||||
# Note XRAY_ROI_GRID_* is something else
|
||||
m = re.match(
|
||||
r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
m = re.match(r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
ms = [int(m.group(i + 1)) for i in range(4)]
|
||||
return ((ms[0], ms[2] + 1), (ms[1], ms[3] + 1))
|
||||
|
||||
|
||||
CLBN = 600
|
||||
SLICEX, SLICEY = slice_xy()
|
||||
# 800
|
||||
|
|
@ -23,28 +20,26 @@ print('//SLICEY: %s' % str(SLICEY))
|
|||
print('//SLICEN: %s' % str(SLICEN))
|
||||
print('//Requested CLBs: %s' % str(CLBN))
|
||||
|
||||
|
||||
def gen_slices():
|
||||
for slicey in range(*SLICEY):
|
||||
for slicex in range(*SLICEX):
|
||||
yield "SLICE_X%dY%d" % (slicex, slicey)
|
||||
|
||||
|
||||
DIN_N = CLBN * 4
|
||||
DOUT_N = CLBN * 1
|
||||
ffprims = (
|
||||
'FDRE',
|
||||
'FDRE',
|
||||
)
|
||||
ff_bels = (
|
||||
'AFF',
|
||||
'A5FF',
|
||||
'BFF',
|
||||
'B5FF',
|
||||
'CFF',
|
||||
'C5FF',
|
||||
'DFF',
|
||||
'D5FF',
|
||||
)
|
||||
'AFF',
|
||||
'A5FF',
|
||||
'BFF',
|
||||
'B5FF',
|
||||
'CFF',
|
||||
'C5FF',
|
||||
'DFF',
|
||||
'D5FF',
|
||||
)
|
||||
|
||||
print('''
|
||||
module top(input clk, stb, di, output do);
|
||||
|
|
@ -79,8 +74,7 @@ endmodule
|
|||
f = open('params.csv', 'w')
|
||||
f.write('name,loc,ce,r\n')
|
||||
slices = gen_slices()
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (
|
||||
DIN_N - 1, DOUT_N - 1))
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (DIN_N - 1, DOUT_N - 1))
|
||||
for i in range(CLBN):
|
||||
ffprim = random.choice(ffprims)
|
||||
force_ce = random.randint(0, 1)
|
||||
|
|
@ -92,10 +86,8 @@ for i in range(CLBN):
|
|||
bel = "AFF"
|
||||
name = 'clb_%s' % ffprim
|
||||
print(' %s' % name)
|
||||
print(' #(.LOC("%s"), .BEL("%s"), .FORCE_CE1(%d), .nFORCE_R0(%d))' % (
|
||||
loc, bel, force_ce, force_r))
|
||||
print(
|
||||
' clb_%d (.clk(clk), .din(din[ %d +: 4]), .dout(dout[ %d]));' % (i, 4 * i, 1 * i))
|
||||
print(' #(.LOC("%s"), .BEL("%s"), .FORCE_CE1(%d), .nFORCE_R0(%d))' % (loc, bel, force_ce, force_r))
|
||||
print(' clb_%d (.clk(clk), .din(din[ %d +: 4]), .dout(dout[ %d]));' % (i, 4 * i, 1 * i))
|
||||
f.write('%s,%s,%s,%s\n' % (name, loc, force_ce, force_r))
|
||||
f.close()
|
||||
print('''endmodule
|
||||
|
|
@ -120,3 +112,4 @@ module clb_FDRE (input clk, input [3:0] din, output dout);
|
|||
);
|
||||
endmodule
|
||||
''')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import sys, os, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -20,7 +18,7 @@ clb_NFFMUX_O6,SLICE_X14Y100,3
|
|||
f = open('params.csv', 'r')
|
||||
f.readline()
|
||||
for l in f:
|
||||
module, loc, n = l.split(',')
|
||||
module,loc,n = l.split(',')
|
||||
n = int(n)
|
||||
which = chr(ord('A') + n)
|
||||
# clb_NFFMUX_AX => AX
|
||||
|
|
@ -65,22 +63,17 @@ for l in f:
|
|||
for loc, muxes in cache.items():
|
||||
for which in muxes:
|
||||
for src in "F7 F8 CY O5 AX XOR O6".split():
|
||||
if src == "F7" and which not in "AC":
|
||||
continue
|
||||
if src == "F8" and which not in "B":
|
||||
continue
|
||||
if src == "AX":
|
||||
src = which + "X"
|
||||
if src == "F7" and which not in "AC": continue
|
||||
if src == "F8" and which not in "B": continue
|
||||
if src == "AX": src = which + "X"
|
||||
tag = "%sFF.DMUX.%s" % (which, src)
|
||||
segmk.addtag(loc, tag, 0)
|
||||
|
||||
# we know that all bits for those MUXes are in frames 30 and 31, so filter all other bits
|
||||
|
||||
|
||||
def bitfilter(frame_idx, bit_idx):
|
||||
assert os.getenv("XRAY_DATABASE") == "artix7"
|
||||
return frame_idx in [30, 31]
|
||||
|
||||
|
||||
segmk.compile(bitfilter=bitfilter)
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -3,17 +3,14 @@ random.seed(0)
|
|||
import os
|
||||
import re
|
||||
|
||||
|
||||
def slice_xy():
|
||||
'''Return (X1, X2), (Y1, Y2) from XRAY_ROI, exclusive end (for xrange)'''
|
||||
# SLICE_X12Y100:SLICE_X27Y149
|
||||
# Note XRAY_ROI_GRID_* is something else
|
||||
m = re.match(
|
||||
r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
m = re.match(r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
ms = [int(m.group(i + 1)) for i in range(4)]
|
||||
return ((ms[0], ms[2] + 1), (ms[1], ms[3] + 1))
|
||||
|
||||
|
||||
CLBN = 400
|
||||
SLICEX, SLICEY = slice_xy()
|
||||
# 800
|
||||
|
|
@ -23,13 +20,11 @@ print('//SLICEY: %s' % str(SLICEY))
|
|||
print('//SLICEN: %s' % str(SLICEN))
|
||||
print('//Requested CLBs: %s' % str(CLBN))
|
||||
|
||||
|
||||
def gen_slices():
|
||||
for slicey in range(*SLICEY):
|
||||
for slicex in range(*SLICEX):
|
||||
yield "SLICE_X%dY%d" % (slicex, slicey)
|
||||
|
||||
|
||||
DIN_N = CLBN * 8
|
||||
DOUT_N = CLBN * 8
|
||||
|
||||
|
|
@ -66,11 +61,9 @@ endmodule
|
|||
f = open('params.csv', 'w')
|
||||
f.write('module,loc,n\n')
|
||||
slices = gen_slices()
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (
|
||||
DIN_N - 1, DOUT_N - 1))
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (DIN_N - 1, DOUT_N - 1))
|
||||
for i in range(CLBN):
|
||||
modules = ['clb_NFFMUX_' +
|
||||
x for x in ['AX', 'CY', 'F78', 'O5', 'O6', 'XOR']]
|
||||
modules = ['clb_NFFMUX_' + x for x in ['AX', 'CY', 'F78', 'O5', 'O6', 'XOR']]
|
||||
module = random.choice(modules)
|
||||
|
||||
if module == 'clb_NFFMUX_F78':
|
||||
|
|
@ -82,8 +75,7 @@ for i in range(CLBN):
|
|||
|
||||
print(' %s' % module)
|
||||
print(' #(.LOC("%s"), .N(%d))' % (loc, n))
|
||||
print(
|
||||
' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (i, 8 * i, 8 * i))
|
||||
print(' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (i, 8 * i, 8 * i))
|
||||
|
||||
f.write('%s,%s,%s\n' % (module, loc, n))
|
||||
f.close()
|
||||
|
|
@ -338,3 +330,4 @@ module clb_NFFMUX_XOR (input clk, input [7:0] din, output [7:0] dout);
|
|||
.ff_d(caro));
|
||||
endmodule
|
||||
''')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import sys, os, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -20,7 +18,7 @@ clb_NFFMUX_O6,SLICE_X14Y100,3
|
|||
f = open('params.csv', 'r')
|
||||
f.readline()
|
||||
for l in f:
|
||||
module, loc, n = l.split(',')
|
||||
module,loc,n = l.split(',')
|
||||
n = int(n)
|
||||
which = chr(ord('A') + n)
|
||||
# clb_NFFMUX_AX => AX
|
||||
|
|
@ -65,16 +63,12 @@ for l in f:
|
|||
for loc, muxes in cache.items():
|
||||
for which in muxes:
|
||||
for src in "F7 F8 CY O5 XOR O6 5Q".split():
|
||||
if src == "F7" and which not in "AC":
|
||||
continue
|
||||
if src == "F8" and which not in "B":
|
||||
continue
|
||||
if src == "5Q":
|
||||
src = which + "5Q"
|
||||
if src == "F7" and which not in "AC": continue
|
||||
if src == "F8" and which not in "B": continue
|
||||
if src == "5Q": src = which + "5Q"
|
||||
tag = "%sMUX.%s" % (which, src)
|
||||
segmk.addtag(loc, tag, 0)
|
||||
|
||||
|
||||
def bitfilter(frame_idx, bit_idx):
|
||||
assert os.getenv("XRAY_DATABASE") == "artix7"
|
||||
|
||||
|
|
@ -82,16 +76,15 @@ def bitfilter(frame_idx, bit_idx):
|
|||
# in this fuzzer we get some aliasing with those bits, so we have to manually exclude
|
||||
# them. (Maybe FIXME: read the bit locations from the database files)
|
||||
if (frame_idx, bit_idx) in [
|
||||
(30, 55), (31, 55), # D5MA
|
||||
(31, 44), (31, 45), # C5MA
|
||||
(30, 19), (31, 19), # B5MA
|
||||
(30, 9), (31, 8), # A5MA
|
||||
]:
|
||||
return False
|
||||
(30, 55), (31, 55), # D5MA
|
||||
(31, 44), (31, 45), # C5MA
|
||||
(30, 19), (31, 19), # B5MA
|
||||
(30, 9), (31, 8), # A5MA
|
||||
]: return False
|
||||
|
||||
# we know that all bits for those MUXes are in frames 30 and 31, so filter all other bits
|
||||
return frame_idx in [30, 31]
|
||||
|
||||
|
||||
segmk.compile(bitfilter=bitfilter)
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -3,17 +3,14 @@ random.seed(0)
|
|||
import os
|
||||
import re
|
||||
|
||||
|
||||
def slice_xy():
|
||||
'''Return (X1, X2), (Y1, Y2) from XRAY_ROI, exclusive end (for xrange)'''
|
||||
# SLICE_X12Y100:SLICE_X27Y149
|
||||
# Note XRAY_ROI_GRID_* is something else
|
||||
m = re.match(
|
||||
r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
m = re.match(r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
ms = [int(m.group(i + 1)) for i in range(4)]
|
||||
return ((ms[0], ms[2] + 1), (ms[1], ms[3] + 1))
|
||||
|
||||
|
||||
CLBN = 400
|
||||
SLICEX, SLICEY = slice_xy()
|
||||
# 800
|
||||
|
|
@ -23,13 +20,11 @@ print('//SLICEY: %s' % str(SLICEY))
|
|||
print('//SLICEN: %s' % str(SLICEN))
|
||||
print('//Requested CLBs: %s' % str(CLBN))
|
||||
|
||||
|
||||
def gen_slices():
|
||||
for slicey in range(*SLICEY):
|
||||
for slicex in range(*SLICEX):
|
||||
yield "SLICE_X%dY%d" % (slicex, slicey)
|
||||
|
||||
|
||||
DIN_N = CLBN * 8
|
||||
DOUT_N = CLBN * 8
|
||||
|
||||
|
|
@ -66,8 +61,7 @@ endmodule
|
|||
f = open('params.csv', 'w')
|
||||
f.write('module,loc,n\n')
|
||||
slices = gen_slices()
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (
|
||||
DIN_N - 1, DOUT_N - 1))
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (DIN_N - 1, DOUT_N - 1))
|
||||
for i in range(CLBN):
|
||||
# Don't have an O6 example
|
||||
modules = ['clb_NOUTMUX_' + x for x in ['CY', 'F78', 'O5', 'XOR', 'B5Q']]
|
||||
|
|
@ -82,8 +76,7 @@ for i in range(CLBN):
|
|||
|
||||
print(' %s' % module)
|
||||
print(' #(.LOC("%s"), .N(%d))' % (loc, n))
|
||||
print(
|
||||
' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (i, 8 * i, 8 * i))
|
||||
print(' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (i, 8 * i, 8 * i))
|
||||
|
||||
f.write('%s,%s,%s\n' % (module, loc, n))
|
||||
f.close()
|
||||
|
|
@ -312,3 +305,4 @@ module clb_NOUTMUX_B5Q (input clk, input [7:0] din, output [7:0] dout);
|
|||
.ff_q(dout[0]));
|
||||
endmodule
|
||||
''')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import sys, os, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -13,7 +11,7 @@ print("Loading tags")
|
|||
f = open('params.csv', 'r')
|
||||
f.readline()
|
||||
for l in f:
|
||||
module, loc, loc2 = l.split(',')
|
||||
module,loc,loc2 = l.split(',')
|
||||
# clb_PRECYINIT_AX => AX
|
||||
src = module.replace('clb_PRECYINIT_', '')
|
||||
|
||||
|
|
@ -31,3 +29,4 @@ for l in f:
|
|||
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -3,17 +3,14 @@ random.seed(0)
|
|||
import os
|
||||
import re
|
||||
|
||||
|
||||
def slice_xy():
|
||||
'''Return (X1, X2), (Y1, Y2) from XRAY_ROI, exclusive end (for xrange)'''
|
||||
# SLICE_X12Y100:SLICE_X27Y149
|
||||
# Note XRAY_ROI_GRID_* is something else
|
||||
m = re.match(
|
||||
r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
m = re.match(r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
ms = [int(m.group(i + 1)) for i in range(4)]
|
||||
return ((ms[0], ms[2] + 1), (ms[1], ms[3] + 1))
|
||||
|
||||
|
||||
CLBN = 400
|
||||
SLICEX, SLICEY = slice_xy()
|
||||
# 800
|
||||
|
|
@ -25,15 +22,12 @@ print('//Requested CLBs: %s' % str(CLBN))
|
|||
|
||||
# Rearranged to sweep Y so that carry logic is easy to allocate
|
||||
# XXX: careful...if odd number of Y in ROI will break carry
|
||||
|
||||
|
||||
def gen_slices():
|
||||
for slicex in range(*SLICEX):
|
||||
for slicey in range(*SLICEY):
|
||||
# caller may reject position if needs more room
|
||||
yield ("SLICE_X%dY%d" % (slicex, slicey), (slicex, slicey))
|
||||
|
||||
|
||||
DIN_N = CLBN * 8
|
||||
DOUT_N = CLBN * 8
|
||||
|
||||
|
|
@ -70,8 +64,7 @@ endmodule
|
|||
f = open('params.csv', 'w')
|
||||
f.write('module,loc,loc2\n')
|
||||
slices = gen_slices()
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (
|
||||
DIN_N - 1, DOUT_N - 1))
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (DIN_N - 1, DOUT_N - 1))
|
||||
for i in range(CLBN):
|
||||
# Don't have an O6 example
|
||||
modules = ['clb_PRECYINIT_' + x for x in ['0', '1', 'AX', 'CIN']]
|
||||
|
|
@ -95,8 +88,7 @@ for i in range(CLBN):
|
|||
|
||||
print(' %s' % module)
|
||||
print(' #(%s)' % (params))
|
||||
print(
|
||||
' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (i, 8 * i, 8 * i))
|
||||
print(' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (i, 8 * i, 8 * i))
|
||||
|
||||
f.write('%s,%s\n' % (module, paramsc))
|
||||
f.close()
|
||||
|
|
@ -142,3 +134,4 @@ module clb_PRECYINIT_CIN (input clk, input [7:0] din, output [7:0] dout);
|
|||
CARRY4 carry4_ci(.O(), .CO(co), .DI(din[3:0]), .S(din[7:4]), .CYINIT(1'b0), .CI());
|
||||
endmodule
|
||||
''')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import os
|
||||
import sys, re, os
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -14,12 +12,12 @@ segmk = segmaker("design.bits")
|
|||
multi_bels_by = [
|
||||
'SRL16E',
|
||||
'SRLC32E',
|
||||
]
|
||||
]
|
||||
# Not BELable
|
||||
multi_bels_bn = [
|
||||
'RAM32X1S',
|
||||
'RAM64X1S',
|
||||
]
|
||||
]
|
||||
|
||||
# Those requiring special resources
|
||||
# Just make one per module
|
||||
|
|
@ -27,7 +25,7 @@ greedy_modules = [
|
|||
'my_RAM128X1D',
|
||||
'my_RAM128X1S',
|
||||
'my_RAM256X1S',
|
||||
]
|
||||
]
|
||||
|
||||
print("Loading tags")
|
||||
'''
|
||||
|
|
@ -40,10 +38,9 @@ f = open('params.csv', 'r')
|
|||
f.readline()
|
||||
for l in f:
|
||||
l = l.strip()
|
||||
module, loc, p0, p1, p2, p3 = l.split(',')
|
||||
module,loc,p0,p1,p2,p3 = l.split(',')
|
||||
|
||||
segmk.addtag(loc, "WA7USED", module in (
|
||||
'my_RAM128X1D', 'my_RAM128X1S', 'my_RAM256X1S'))
|
||||
segmk.addtag(loc, "WA7USED", module in ('my_RAM128X1D', 'my_RAM128X1S', 'my_RAM256X1S'))
|
||||
segmk.addtag(loc, "WA8USED", module == 'my_RAM256X1S')
|
||||
|
||||
# (a, b, c, d)
|
||||
|
|
@ -56,7 +53,7 @@ for l in f:
|
|||
|
||||
if module == 'my_ram_N':
|
||||
# Each one of: SRL16E, SRLC32E, LUT6
|
||||
bels = [p0, p1, p2, p3]
|
||||
bels = [p0,p1,p2,p3]
|
||||
|
||||
# Clock Enable (CE) clock gate only enabled if we have clocked elements
|
||||
# A pure LUT6 does not, but everything else should
|
||||
|
|
@ -85,12 +82,12 @@ for l in f:
|
|||
(1, 0, 0, 1),
|
||||
(1, 1, 0, 1),
|
||||
(1, 1, 1, 1),
|
||||
]
|
||||
]
|
||||
# Uses CD first
|
||||
pack2 = [
|
||||
(0, 0, 1, 1),
|
||||
(1, 1, 1, 1),
|
||||
]
|
||||
]
|
||||
|
||||
# Always use all 4 sites
|
||||
if module in ('my_RAM32M', 'my_RAM64M', 'my_RAM128X1D', 'my_RAM256X1S'):
|
||||
|
|
@ -111,7 +108,7 @@ for l in f:
|
|||
assert(ram[3])
|
||||
|
||||
if module == 'my_RAM32X1D':
|
||||
# Occupies CD
|
||||
# Occupies CD
|
||||
size[2] = 1
|
||||
size[3] = 1
|
||||
elif module == 'my_RAM32M':
|
||||
|
|
@ -128,13 +125,12 @@ for l in f:
|
|||
# FIXME
|
||||
module == segmk.addtag(loc, "%sLUT.SMALL" % bel, size[beli])
|
||||
|
||||
|
||||
def bitfilter(frame_idx, bit_idx):
|
||||
# Hack to remove aliased PIP bits on CE
|
||||
# We should either mix up routing more or exclude previous DB entries
|
||||
assert os.getenv("XRAY_DATABASE") == "artix7"
|
||||
return (frame_idx, bit_idx) not in [(0, 27), (1, 25), (1, 26), (1, 29)]
|
||||
|
||||
|
||||
segmk.compile(bitfilter=bitfilter)
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -20,17 +20,14 @@ random.seed(0)
|
|||
import os
|
||||
import re
|
||||
|
||||
|
||||
def slice_xy():
|
||||
'''Return (X1, X2), (Y1, Y2) from XRAY_ROI, exclusive end (for xrange)'''
|
||||
# SLICE_X12Y100:SLICE_X27Y149
|
||||
# Note XRAY_ROI_GRID_* is something else
|
||||
m = re.match(
|
||||
r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
m = re.match(r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
ms = [int(m.group(i + 1)) for i in range(4)]
|
||||
return ((ms[0], ms[2] + 1), (ms[1], ms[3] + 1))
|
||||
|
||||
|
||||
CLBN = 50
|
||||
SLICEX, SLICEY = slice_xy()
|
||||
# 800
|
||||
|
|
@ -42,8 +39,6 @@ print('//Requested CLBs: %s' % str(CLBN))
|
|||
|
||||
# Rearranged to sweep Y so that carry logic is easy to allocate
|
||||
# XXX: careful...if odd number of Y in ROI will break carry
|
||||
|
||||
|
||||
def gen_slicems():
|
||||
'''
|
||||
SLICEM at the following:
|
||||
|
|
@ -59,7 +54,7 @@ def gen_slicems():
|
|||
for slicex in (12, 14):
|
||||
for slicey in range(*SLICEY):
|
||||
# caller may reject position if needs more room
|
||||
# yield ("SLICE_X%dY%d" % (slicex, slicey), (slicex, slicey))
|
||||
#yield ("SLICE_X%dY%d" % (slicex, slicey), (slicex, slicey))
|
||||
yield "SLICE_X%dY%d" % (slicex, slicey)
|
||||
|
||||
|
||||
|
|
@ -99,8 +94,7 @@ endmodule
|
|||
f = open('params.csv', 'w')
|
||||
f.write('module,loc,bela,belb,belc,beld\n')
|
||||
slices = gen_slicems()
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (
|
||||
DIN_N - 1, DOUT_N - 1))
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (DIN_N - 1, DOUT_N - 1))
|
||||
randluts = 0
|
||||
for clbi in range(CLBN):
|
||||
loc = next(slices)
|
||||
|
|
@ -119,7 +113,7 @@ for clbi in range(CLBN):
|
|||
'SRL16E',
|
||||
'SRLC32E',
|
||||
'LUT6',
|
||||
]
|
||||
]
|
||||
|
||||
bels = []
|
||||
for beli in range(4):
|
||||
|
|
@ -150,7 +144,7 @@ for clbi in range(CLBN):
|
|||
('my_RAM128X1S_N', 2, 1),
|
||||
('my_RAM128X1D', None, 1),
|
||||
('my_RAM256X1S', None, 1),
|
||||
]
|
||||
]
|
||||
|
||||
module, nmax, ff_param = random.choice(modules)
|
||||
|
||||
|
|
@ -171,8 +165,7 @@ for clbi in range(CLBN):
|
|||
|
||||
print(' %s' % module)
|
||||
print(' #(.LOC("%s")%s)' % (loc, params))
|
||||
print(' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (
|
||||
clbi, 8 * clbi, 8 * clbi))
|
||||
print(' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (clbi, 8 * clbi, 8 * clbi))
|
||||
|
||||
f.write('%s,%s%s\n' % (module, loc, cparams))
|
||||
f.close()
|
||||
|
|
@ -517,3 +510,4 @@ module my_ram_N (input clk, input [7:0] din, output [7:0] dout);
|
|||
endmodule
|
||||
|
||||
''')
|
||||
|
||||
|
|
|
|||
|
|
@ -5,9 +5,7 @@
|
|||
# Can we find instance where they are not aliased?
|
||||
WA7USED = 0
|
||||
|
||||
import sys
|
||||
import re
|
||||
import os
|
||||
import sys, re, os
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -25,7 +23,7 @@ f = open('params.csv', 'r')
|
|||
f.readline()
|
||||
for l in f:
|
||||
l = l.strip()
|
||||
module, loc, c31, b31, a31 = l.split(',')
|
||||
module,loc,c31,b31,a31 = l.split(',')
|
||||
c31 = int(c31)
|
||||
b31 = int(b31)
|
||||
a31 = int(a31)
|
||||
|
|
@ -35,3 +33,4 @@ for l in f:
|
|||
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -3,17 +3,14 @@ random.seed(0)
|
|||
import os
|
||||
import re
|
||||
|
||||
|
||||
def slice_xy():
|
||||
'''Return (X1, X2), (Y1, Y2) from XRAY_ROI, exclusive end (for xrange)'''
|
||||
# SLICE_X12Y100:SLICE_X27Y149
|
||||
# Note XRAY_ROI_GRID_* is something else
|
||||
m = re.match(
|
||||
r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
m = re.match(r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI'))
|
||||
ms = [int(m.group(i + 1)) for i in range(4)]
|
||||
return ((ms[0], ms[2] + 1), (ms[1], ms[3] + 1))
|
||||
|
||||
|
||||
CLBN = 50
|
||||
SLICEX, SLICEY = slice_xy()
|
||||
# 800
|
||||
|
|
@ -25,8 +22,6 @@ print('//Requested CLBs: %s' % str(CLBN))
|
|||
|
||||
# Rearranged to sweep Y so that carry logic is easy to allocate
|
||||
# XXX: careful...if odd number of Y in ROI will break carry
|
||||
|
||||
|
||||
def gen_slicems():
|
||||
'''
|
||||
SLICEM at the following:
|
||||
|
|
@ -42,7 +37,7 @@ def gen_slicems():
|
|||
for slicex in (12, 14):
|
||||
for slicey in range(*SLICEY):
|
||||
# caller may reject position if needs more room
|
||||
# yield ("SLICE_X%dY%d" % (slicex, slicey), (slicex, slicey))
|
||||
#yield ("SLICE_X%dY%d" % (slicex, slicey), (slicex, slicey))
|
||||
yield "SLICE_X%dY%d" % (slicex, slicey)
|
||||
|
||||
|
||||
|
|
@ -82,8 +77,7 @@ endmodule
|
|||
f = open('params.csv', 'w')
|
||||
f.write('module,loc,c31,b31,a31\n')
|
||||
slices = gen_slicems()
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (
|
||||
DIN_N - 1, DOUT_N - 1))
|
||||
print('module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (DIN_N - 1, DOUT_N - 1))
|
||||
multis = 0
|
||||
for clbi in range(CLBN):
|
||||
loc = next(slices)
|
||||
|
|
@ -93,10 +87,8 @@ for clbi in range(CLBN):
|
|||
a31 = random.randint(0, 1)
|
||||
|
||||
print(' %s' % module)
|
||||
print(' #(.LOC("%s"), .C31(%d), .B31(%d), .A31(%d))' %
|
||||
(loc, c31, b31, a31))
|
||||
print(' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (
|
||||
clbi, 8 * clbi, 8 * clbi))
|
||||
print(' #(.LOC("%s"), .C31(%d), .B31(%d), .A31(%d))' % (loc, c31, b31, a31))
|
||||
print(' clb_%d (.clk(clk), .din(din[ %d +: 8]), .dout(dout[ %d +: 8]));' % (clbi, 8 * clbi, 8 * clbi))
|
||||
|
||||
f.write('%s,%s,%d,%d,%d\n' % (module, loc, c31, b31, a31))
|
||||
f.close()
|
||||
|
|
@ -167,3 +159,4 @@ module my_NDI1MUX_NI_NMC31 (input clk, input [7:0] din, output [7:0] dout);
|
|||
.D(lutd[0]));
|
||||
endmodule
|
||||
''')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import sys, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -64,3 +63,4 @@ for tile, pips_srcs_dsts in tiledata.items():
|
|||
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import os
|
||||
import sys, re, os
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -63,13 +61,12 @@ for tile, pips_srcs_dsts in tiledata.items():
|
|||
elif src_dst[1] not in dsts:
|
||||
segmk.addtag(tile, "%s.%s" % (dst, src), 0)
|
||||
|
||||
|
||||
def bitfilter(frame_idx, bit_idx):
|
||||
assert os.getenv("XRAY_DATABASE") in ["artix7", "kintex7"]
|
||||
if frame_idx in [30, 31]:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
segmk.compile(bitfilter=bitfilter)
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
import os, re
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
todos = set()
|
||||
|
|
@ -18,8 +16,6 @@ def maketodo(pipfile, dbfile):
|
|||
if re.match(r"^INT_[LR].IMUX(_L)?[0-9]+\.LOGIC_OUTS(_L)?[0-9]+$", line):
|
||||
print(line)
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import sys, os, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -60,7 +58,6 @@ for tile, pips_srcs_dsts in tiledata.items():
|
|||
elif src_dst[1] not in dsts:
|
||||
segmk.addtag(tile, "%s.%s" % (dst, src), 0)
|
||||
|
||||
|
||||
def bitfilter(frame_idx, bit_idx):
|
||||
assert os.getenv("XRAY_DATABASE") in ["artix7", "kintex7"]
|
||||
if frame_idx == 0 and bit_idx == 48:
|
||||
|
|
@ -69,6 +66,6 @@ def bitfilter(frame_idx, bit_idx):
|
|||
return False
|
||||
return frame_idx in [0, 1]
|
||||
|
||||
|
||||
segmk.compile(bitfilter=bitfilter)
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
import os, re
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
todos = set()
|
||||
|
|
@ -18,8 +16,6 @@ def maketodo(pipfile, dbfile):
|
|||
if re.match(r"^INT_[LR].CLK", line):
|
||||
print(line)
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import sys, os, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -60,13 +58,12 @@ for tile, pips_srcs_dsts in tiledata.items():
|
|||
elif src_dst[1] not in dsts:
|
||||
segmk.addtag(tile, "%s.%s" % (dst, src), 0)
|
||||
|
||||
|
||||
def bitfilter(frame_idx, bit_idx):
|
||||
assert os.getenv("XRAY_DATABASE") in ["artix7", "kintex7"]
|
||||
if (frame_idx, bit_idx) in [(0, 48), (1, 31), (0, 32), (1, 35)]:
|
||||
return False
|
||||
return frame_idx in [0, 1]
|
||||
|
||||
|
||||
segmk.compile(bitfilter=bitfilter)
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
import os, re
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
todos = set()
|
||||
|
|
@ -18,8 +16,6 @@ def maketodo(pipfile, dbfile):
|
|||
if re.match(r"^INT_[LR].CTRL", line):
|
||||
print(line)
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import sys, os, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -62,3 +60,4 @@ for tile, pips_srcs_dsts in tiledata.items():
|
|||
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
import os, re
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
todos = set()
|
||||
|
|
@ -18,8 +16,6 @@ def maketodo(pipfile, dbfile):
|
|||
if re.match(r"^INT_[LR].GFAN", line) and not line.endswith(".GND_WIRE"):
|
||||
print(line)
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import sys, os, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -62,3 +60,4 @@ for tile, pips_srcs_dsts in tiledata.items():
|
|||
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import sys, os, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -72,3 +70,4 @@ for tile, pips_srcs_dsts in tiledata.items():
|
|||
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
import os, re
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
todos = set()
|
||||
|
|
@ -18,8 +16,6 @@ def maketodo(pipfile, dbfile):
|
|||
if not line.endswith(".VCC_WIRE"):
|
||||
print(line)
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
||||
maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import sys, os, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -42,11 +40,10 @@ for tile, pips_nodes in tiledata.items():
|
|||
elif dst not in nodes and src not in nodes:
|
||||
segmk.addtag(tile, "%s.%s" % (dst, src), 0)
|
||||
|
||||
|
||||
def bitfilter(frame_idx, bit_idx):
|
||||
assert os.getenv("XRAY_DATABASE") in ["artix7", "kintex7"]
|
||||
return frame_idx in [0, 1]
|
||||
|
||||
|
||||
segmk.compile(bitfilter=bitfilter)
|
||||
segmk.write()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
import os, re
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
todos = set()
|
||||
|
|
@ -18,8 +16,6 @@ def maketodo(pipfile, dbfile):
|
|||
for line in todos:
|
||||
print(line)
|
||||
|
||||
maketodo("bipips_int_l.txt", "%s/%s/segbits_int_l.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("bipips_int_r.txt", "%s/%s/segbits_int_r.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
||||
maketodo("bipips_int_l.txt", "%s/%s/segbits_int_l.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
maketodo("bipips_int_r.txt", "%s/%s/segbits_int_r.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")))
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import sys, os, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -52,3 +50,4 @@ for arg in sys.argv[1:]:
|
|||
|
||||
segmk.compile()
|
||||
segmk.write(arg)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import re
|
||||
import os, sys, json, re
|
||||
|
||||
tilenodes = dict()
|
||||
grid2tile = dict()
|
||||
|
|
@ -27,56 +24,38 @@ with open("nodewires.txt") as f:
|
|||
tilenodes[wire_tile] = dict()
|
||||
tilenodes[wire_tile][node] = wire_name
|
||||
|
||||
|
||||
def filter_pair(type1, type2, wire1, wire2, delta_x, delta_y):
|
||||
if type1 in ["HCLK_L", "HCLK_R"]:
|
||||
is_vertical_wire = False
|
||||
if wire1.startswith("HCLK_S"):
|
||||
is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_N"):
|
||||
is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_W"):
|
||||
is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_E"):
|
||||
is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_LV"):
|
||||
is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_BYP"):
|
||||
is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_FAN"):
|
||||
is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_LEAF_CLK_"):
|
||||
is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_S"): is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_N"): is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_W"): is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_E"): is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_LV"): is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_BYP"): is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_FAN"): is_vertical_wire = True
|
||||
if wire1.startswith("HCLK_LEAF_CLK_"): is_vertical_wire = True
|
||||
|
||||
is_horizontal_wire = False
|
||||
if wire1.startswith("HCLK_CK_"):
|
||||
is_horizontal_wire = True
|
||||
if wire1.startswith("HCLK_INT_"):
|
||||
is_horizontal_wire = True
|
||||
if wire1.startswith("HCLK_CK_"): is_horizontal_wire = True
|
||||
if wire1.startswith("HCLK_INT_"): is_horizontal_wire = True
|
||||
|
||||
assert is_vertical_wire != is_horizontal_wire
|
||||
if is_vertical_wire and delta_y == 0:
|
||||
return True
|
||||
if is_horizontal_wire and delta_x == 0:
|
||||
return True
|
||||
if is_vertical_wire and delta_y == 0: return True
|
||||
if is_horizontal_wire and delta_x == 0: return True
|
||||
|
||||
if type1 in ["INT_L", "INT_R"]:
|
||||
# the wires with underscore after BEG/END all connect vertically
|
||||
if (("BEG_" in wire1) or ("END_" in wire1)) and delta_y == 0:
|
||||
return True
|
||||
if (("BEG_" in wire1) or ("END_" in wire1)) and delta_y == 0: return True
|
||||
|
||||
if type1 in ["BRKH_INT", "BRKH_B_TERM_INT", "T_TERM_INT"]:
|
||||
if delta_y == 0:
|
||||
return True
|
||||
if delta_y == 0: return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def handle_pair(tile1, tile2):
|
||||
if tile1 not in tilenodes:
|
||||
return
|
||||
if tile2 not in tilenodes:
|
||||
return
|
||||
if tile1 not in tilenodes: return
|
||||
if tile2 not in tilenodes: return
|
||||
|
||||
tile1data = grid["tiles"][tile1]
|
||||
tile2data = grid["tiles"][tile2]
|
||||
|
|
@ -87,8 +66,7 @@ def handle_pair(tile1, tile2):
|
|||
if grid1_xy > grid2_xy:
|
||||
return handle_pair(tile2, tile1)
|
||||
|
||||
key = (tile1data["type"], tile2data["type"],
|
||||
grid2_xy[0] - grid1_xy[0], grid2_xy[1] - grid1_xy[1])
|
||||
key = (tile1data["type"], tile2data["type"], grid2_xy[0] - grid1_xy[0], grid2_xy[1] - grid1_xy[1])
|
||||
|
||||
wire_pairs = set()
|
||||
|
||||
|
|
@ -106,10 +84,9 @@ def handle_pair(tile1, tile2):
|
|||
else:
|
||||
database[key] &= wire_pairs
|
||||
|
||||
|
||||
for tile, tiledata in grid["tiles"].items():
|
||||
grid_right_xy = (tiledata["grid_x"] + 1, tiledata["grid_y"])
|
||||
grid_below_xy = (tiledata["grid_x"], tiledata["grid_y"] + 1)
|
||||
grid_right_xy = (tiledata["grid_x"]+1, tiledata["grid_y"])
|
||||
grid_below_xy = (tiledata["grid_x"], tiledata["grid_y"]+1)
|
||||
|
||||
if grid_right_xy in grid2tile:
|
||||
handle_pair(tile, grid2tile[grid_right_xy])
|
||||
|
|
@ -131,3 +108,4 @@ for key in sorted(database.keys()):
|
|||
print("Writing tileconn.json.")
|
||||
with open("tileconn.json", "w") as f:
|
||||
print(json.dumps(json_db, sort_keys=True, indent="\t"), file=f)
|
||||
|
||||
|
|
|
|||
|
|
@ -13,20 +13,17 @@ db_site_prop = dict()
|
|||
db_site_tile = dict()
|
||||
db_site_bit = dict()
|
||||
|
||||
|
||||
def add_tile(tile):
|
||||
if tile not in db_tiles:
|
||||
db_tiles.add(tile)
|
||||
db_tile_prop[tile] = dict()
|
||||
db_tile_sites[tile] = list()
|
||||
|
||||
|
||||
def add_site(site):
|
||||
if site not in db_sites:
|
||||
db_sites.add(site)
|
||||
db_site_prop[site] = dict()
|
||||
|
||||
|
||||
with open("%s.txt" % sys.argv[1]) as f:
|
||||
for line in f:
|
||||
line = line.split()
|
||||
|
|
@ -92,36 +89,34 @@ for site, bit in db_site_bit.items():
|
|||
|
||||
for i in range(50):
|
||||
m = re.match("(.*)Y([0-9]+)", site)
|
||||
this_site = "%sY%d" % (m.group(1), int(m.group(2)) + i)
|
||||
this_site = "%sY%d" % (m.group(1), int(m.group(2))+i)
|
||||
|
||||
tile = db_site_tile[this_site]
|
||||
|
||||
word = bit_word + 2 * i
|
||||
if word >= 50:
|
||||
word += 1
|
||||
word = bit_word + 2*i
|
||||
if word >= 50: word += 1
|
||||
|
||||
entry = dict()
|
||||
entry["BASE_FRAMEID"] = "0x%08x" % ((bit_type << 23) | (
|
||||
bit_half << 22) | (bit_row << 17) | (bit_col << 7))
|
||||
entry["BASE_FRAMEID"] = "0x%08x" % ((bit_type << 23) | (bit_half << 22) | (bit_row << 17) | (bit_col << 7))
|
||||
entry["FRAME_TYPE"] = bit_type
|
||||
entry["FRAME_HALF"] = bit_half
|
||||
entry["FRAME_ROW"] = bit_row
|
||||
entry["FRAME_COLUMN"] = bit_col
|
||||
entry["WORDS"] = [word, word + 1]
|
||||
entry["WORDS"] = [word, word+1]
|
||||
|
||||
database["tiles"][tile]["cfgcol"] = entry
|
||||
|
||||
if database["tiles"][tile]["props"]["TILE_TYPE"] in ("CLBLL_L", "CLBLM_L"):
|
||||
col = int(db_tile_prop[tile]["COLUMN"])
|
||||
row = int(db_tile_prop[tile]["ROW"])
|
||||
right_tile = loc_to_tile[(col + 1, row)]
|
||||
right_tile = loc_to_tile[(col+1, row)]
|
||||
|
||||
database["tiles"][right_tile]["cfgcol"] = entry
|
||||
|
||||
if database["tiles"][tile]["props"]["TILE_TYPE"] in ("CLBLL_R", "CLBLM_R"):
|
||||
col = int(db_tile_prop[tile]["COLUMN"])
|
||||
row = int(db_tile_prop[tile]["ROW"])
|
||||
left_tile = loc_to_tile[(col - 1, row)]
|
||||
left_tile = loc_to_tile[(col-1, row)]
|
||||
|
||||
database["tiles"][left_tile]["cfgcol"] = entry
|
||||
|
||||
|
|
@ -138,3 +133,4 @@ print("Number of tiles with assigned column: %d" % tile_cfgcol_count)
|
|||
|
||||
with open("%s.json" % sys.argv[1], "w") as f:
|
||||
print(json.dumps(database, sort_keys=True, indent="\t"), file=f)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import re
|
||||
import os, sys, json, re
|
||||
from io import StringIO
|
||||
|
||||
import argparse
|
||||
|
|
@ -40,17 +37,13 @@ else:
|
|||
def get_setting(name):
|
||||
return os.getenv(name)
|
||||
|
||||
db_dir = os.path.join(get_setting("XRAY_DATABASE_DIR"),
|
||||
get_setting("XRAY_DATABASE"))
|
||||
|
||||
|
||||
db_dir = os.path.join(get_setting("XRAY_DATABASE_DIR"), get_setting("XRAY_DATABASE"))
|
||||
def db_open(fn):
|
||||
filename = os.path.join(db_dir, fn)
|
||||
if not os.path.exists(filename):
|
||||
return StringIO("")
|
||||
return open(os.path.join(db_dir, fn))
|
||||
|
||||
|
||||
def out_open(fn):
|
||||
out_dir = os.path.join(args.output, get_setting("XRAY_DATABASE"))
|
||||
os.makedirs(out_dir, exist_ok=True)
|
||||
|
|
@ -58,7 +51,6 @@ def out_open(fn):
|
|||
print("Writing %s" % fp)
|
||||
return open(fp, "w")
|
||||
|
||||
|
||||
clb_bitgroups_db = [
|
||||
# copy&paste from zero_db in dbfixup.py
|
||||
"00_21 00_22 00_26 01_28|00_25 01_20 01_21 01_24",
|
||||
|
|
@ -92,9 +84,9 @@ hclk_bitgroups_db = [
|
|||
# groupings for SNWE bits in frames 2..7
|
||||
for i in range(0, 64, 4):
|
||||
clb_bitgroups_db.append("02_%02d 03_%02d 05_%02d 06_%02d 07_%02d|05_%02d 03_%02d 04_%02d 04_%02d" %
|
||||
(i + 1, i, i, i, i + 1, i + 3, i + 1, i + 1, i + 2))
|
||||
(i+1, i, i, i, i+1, i+3, i+1, i+1, i+2))
|
||||
clb_bitgroups_db.append("02_%02d 04_%02d 05_%02d 05_%02d 06_%02d|02_%02d 03_%02d 04_%02d 07_%02d" %
|
||||
(i + 2, i, i + 1, i + 2, i + 2, i + 3, i + 2, i + 3, i + 3))
|
||||
(i+2, i, i+1, i+2, i+2, i+3, i+2, i+3, i+3))
|
||||
|
||||
clb_left_bits = set()
|
||||
clb_right_bits = set()
|
||||
|
|
@ -116,7 +108,6 @@ for entry in hclk_bitgroups_db:
|
|||
for bit in b.split():
|
||||
hclk_right_bits.add(bit)
|
||||
|
||||
|
||||
class UnionFind:
|
||||
def __init__(self):
|
||||
self.parents = dict()
|
||||
|
|
@ -161,8 +152,8 @@ with db_open("tilegrid.json") as f:
|
|||
"tiles": {
|
||||
"NULL": {
|
||||
"grid_x": 0,
|
||||
"grid_y": 0,
|
||||
"type": "NULL",
|
||||
"grid_y":0,
|
||||
"type":"NULL",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -237,13 +228,10 @@ grid_range = None
|
|||
grid_map = dict()
|
||||
|
||||
with out_open("index.html") as f:
|
||||
print("<html><title>X-Ray %s Database</title><body>" %
|
||||
get_setting("XRAY_DATABASE").upper(), file=f)
|
||||
print("<h3>X-Ray %s Database</h3>" %
|
||||
get_setting("XRAY_DATABASE").upper(), file=f)
|
||||
print("<html><title>X-Ray %s Database</title><body>" % get_setting("XRAY_DATABASE").upper(), file=f)
|
||||
print("<h3>X-Ray %s Database</h3>" % get_setting("XRAY_DATABASE").upper(), file=f)
|
||||
|
||||
print("<p><b>Part: %s<br/>ROI: %s<br/>ROI Frames: %s</b></p>" %
|
||||
(get_setting("XRAY_PART"), get_setting("XRAY_ROI"), get_setting("XRAY_ROI_FRAMES")), file=f)
|
||||
print("<p><b>Part: %s<br/>ROI: %s<br/>ROI Frames: %s</b></p>" % (get_setting("XRAY_PART"), get_setting("XRAY_ROI"), get_setting("XRAY_ROI_FRAMES")), file=f)
|
||||
|
||||
for tilename, tiledata in grid["tiles"].items():
|
||||
grid_x = tiledata["grid_x"]
|
||||
|
|
@ -260,33 +248,25 @@ with out_open("index.html") as f:
|
|||
|
||||
print("<table border>", file=f)
|
||||
|
||||
for grid_y in range(grid_range[1], grid_range[3] + 1):
|
||||
for grid_y in range(grid_range[1], grid_range[3]+1):
|
||||
print("<tr>", file=f)
|
||||
|
||||
for grid_x in range(grid_range[0], grid_range[2] + 1):
|
||||
for grid_x in range(grid_range[0], grid_range[2]+1):
|
||||
tilename = grid_map[(grid_x, grid_y)]
|
||||
tiledata = grid["tiles"][tilename]
|
||||
segdata = None
|
||||
|
||||
bgcolor = "#aaaaaa"
|
||||
if tiledata["type"] in ["INT_L", "INT_R"]:
|
||||
bgcolor = "#aaaaff"
|
||||
if tiledata["type"] in ["CLBLL_L", "CLBLL_R"]:
|
||||
bgcolor = "#ffffaa"
|
||||
if tiledata["type"] in ["CLBLM_L", "CLBLM_R"]:
|
||||
bgcolor = "#ffaaaa"
|
||||
if tiledata["type"] in ["HCLK_L", "HCLK_R"]:
|
||||
bgcolor = "#aaffaa"
|
||||
if tiledata["type"] in ["INT_L", "INT_R"]: bgcolor="#aaaaff"
|
||||
if tiledata["type"] in ["CLBLL_L", "CLBLL_R"]: bgcolor="#ffffaa"
|
||||
if tiledata["type"] in ["CLBLM_L", "CLBLM_R"]: bgcolor="#ffaaaa"
|
||||
if tiledata["type"] in ["HCLK_L", "HCLK_R"]: bgcolor="#aaffaa"
|
||||
|
||||
if tiledata["type"] in ["BRAM_INT_INTERFACE_L", "BRAM_L"]:
|
||||
bgcolor = "#aaffff"
|
||||
if tiledata["type"] in ["BRAM_INT_INTERFACE_R", "BRAM_R"]:
|
||||
bgcolor = "#aaffff"
|
||||
if tiledata["type"] in ["BRAM_INT_INTERFACE_L", "BRAM_L"]: bgcolor="#aaffff"
|
||||
if tiledata["type"] in ["BRAM_INT_INTERFACE_R", "BRAM_R"]: bgcolor="#aaffff"
|
||||
|
||||
if tiledata["type"] in ["INT_INTERFACE_L", "DSP_L"]:
|
||||
bgcolor = "#ffaaff"
|
||||
if tiledata["type"] in ["INT_INTERFACE_R", "DSP_R"]:
|
||||
bgcolor = "#ffaaff"
|
||||
if tiledata["type"] in ["INT_INTERFACE_L", "DSP_L"]: bgcolor="#ffaaff"
|
||||
if tiledata["type"] in ["INT_INTERFACE_R", "DSP_R"]: bgcolor="#ffaaff"
|
||||
|
||||
title = [tilename]
|
||||
|
||||
|
|
@ -302,25 +282,21 @@ with out_open("index.html") as f:
|
|||
|
||||
if "segment" in tiledata:
|
||||
if "baseaddr" in segdata:
|
||||
title.append("Baseaddr: %s %d" %
|
||||
tuple(segdata["baseaddr"]))
|
||||
title.append("Baseaddr: %s %d" % tuple(segdata["baseaddr"]))
|
||||
else:
|
||||
print("Warning: no baseaddr in segment %s (via tile %s)." %
|
||||
(tiledata["segment"], tilename))
|
||||
print("Warning: no baseaddr in segment %s (via tile %s)." % (tiledata["segment"], tilename))
|
||||
|
||||
tilename = tilename.replace("INT_INTERFACE_", "INTF_")
|
||||
tilename = tilename.replace("_X", "<br/>X")
|
||||
tilename = tilename.replace("B_TERM", "B<br/>TERM")
|
||||
|
||||
print("<td bgcolor=\"%s\" align=\"center\" title=\"%s\"><span style=\"font-size:10px\">" %
|
||||
(bgcolor, "\n".join(title)), file=f)
|
||||
print("<td bgcolor=\"%s\" align=\"center\" title=\"%s\"><span style=\"font-size:10px\">" % (bgcolor, "\n".join(title)), file=f)
|
||||
if "segment" in tiledata:
|
||||
segtype = segdata["type"].lower()
|
||||
print("<a style=\"text-decoration: none; color: black\" href=\"seg_%s.html\">%s</a></span></td>" %
|
||||
(segtype, tilename.replace("_X", "<br/>X")), file=f)
|
||||
(segtype, tilename.replace("_X", "<br/>X")), file=f)
|
||||
else:
|
||||
print("%s</span></td>" % tilename.replace("_X",
|
||||
"<br/>X").replace("B_TERM", "B<br/>TERM"), file=f)
|
||||
print("%s</span></td>" % tilename.replace("_X", "<br/>X").replace("B_TERM", "B<br/>TERM"), file=f)
|
||||
|
||||
print("</tr>", file=f)
|
||||
|
||||
|
|
@ -333,14 +309,12 @@ with out_open("index.html") as f:
|
|||
|
||||
for segtype in sorted(segbits.keys()):
|
||||
with out_open("seg_%s.html" % segtype) as f:
|
||||
print("<html><title>X-Ray %s Database: %s</title><body>" %
|
||||
(get_setting("XRAY_DATABASE").upper(), segtype.upper()), file=f)
|
||||
print("<html><title>X-Ray %s Database: %s</title><body>" % (get_setting("XRAY_DATABASE").upper(), segtype.upper()), file=f)
|
||||
if segtype in ["hclk_l", "hclk_r"]:
|
||||
print("<h3>X-Ray %s Database: %s Segment</h3>" %
|
||||
(get_setting("XRAY_DATABASE").upper(), segtype.upper()), file=f)
|
||||
print("<h3>X-Ray %s Database: %s Segment</h3>" % (get_setting("XRAY_DATABASE").upper(), segtype.upper()), file=f)
|
||||
else:
|
||||
print("<h3>X-Ray %s Database: %s Segment (%s Tile + %s Tile)</h3>" % (get_setting("XRAY_DATABASE").upper(), segtype.upper(),
|
||||
segtype.upper(), re.sub("clbl[lm]|bram[0-4]|dsp[0-4]", "int", segtype).upper()), file=f)
|
||||
segtype.upper(), re.sub("clbl[lm]|bram[0-4]|dsp[0-4]", "int", segtype).upper()), file=f)
|
||||
|
||||
print("""
|
||||
<script><!--
|
||||
|
|
@ -390,14 +364,12 @@ function oml() {
|
|||
print("<tr>", file=f)
|
||||
print("<th width=\"30\"></th>", file=f)
|
||||
for frameidx in range(segframes[segtype]):
|
||||
print("<th width=\"30\"><span style=\"font-size:10px\">%d</span></th>" %
|
||||
frameidx, file=f)
|
||||
print("<th width=\"30\"><span style=\"font-size:10px\">%d</span></th>" % frameidx, file=f)
|
||||
print("</tr>", file=f)
|
||||
|
||||
for bitidx in range(31 if (segtype in ["hclk_l", "hclk_r"]) else 63, -1, -1):
|
||||
print("<tr>", file=f)
|
||||
print(
|
||||
"<th align=\"right\"><span style=\"font-size:10px\">%d</span></th>" % bitidx, file=f)
|
||||
print("<th align=\"right\"><span style=\"font-size:10px\">%d</span></th>" % bitidx, file=f)
|
||||
for frameidx in range(segframes[segtype]):
|
||||
bit_pos = "%02d_%02d" % (frameidx, bitidx)
|
||||
bit_name = segbits_r[segtype][bit_pos] if bit_pos in segbits_r[segtype] else None
|
||||
|
|
@ -448,8 +420,7 @@ function oml() {
|
|||
else:
|
||||
bgcolor = "#ff0000"
|
||||
|
||||
m = re.search(
|
||||
r"\.([ABCD]5?)FF\.([A-Z]+(\.A|\.B)?)$", bit_name)
|
||||
m = re.search(r"\.([ABCD]5?)FF\.([A-Z]+(\.A|\.B)?)$", bit_name)
|
||||
if m:
|
||||
bgcolor = "#aaffaa"
|
||||
if m.group(2) == "ZINI":
|
||||
|
|
@ -507,64 +478,64 @@ function oml() {
|
|||
label = "BUF"
|
||||
|
||||
elif bit_pos in routebits[segtype]:
|
||||
bgcolor = "#0000ff"
|
||||
label = "R"
|
||||
for bn in sorted(routebits[segtype][bit_pos]):
|
||||
if re.match("^INT_[LR].[SNWE][SNWERL]", bn):
|
||||
if bn[8] == "1":
|
||||
bgcolor = "#4466bb"
|
||||
elif bn[8] == "2":
|
||||
bgcolor = "#aa88ff"
|
||||
elif bn[6:9] in "SS6 SE6 NN6 NW6".split():
|
||||
bgcolor = "#7755ff"
|
||||
else:
|
||||
bgcolor = "#0000ff"
|
||||
label = "R"
|
||||
for bn in sorted(routebits[segtype][bit_pos]):
|
||||
if re.match("^INT_[LR].[SNWE][SNWERL]", bn):
|
||||
if bn[8] == "1":
|
||||
bgcolor = "#4466bb"
|
||||
elif bn[8] == "2":
|
||||
bgcolor = "#aa88ff"
|
||||
elif bn[6:9] in "SS6 SE6 NN6 NW6".split():
|
||||
bgcolor = "#7755ff"
|
||||
else:
|
||||
bgcolor = "#88aaff"
|
||||
label = bn[6:9]
|
||||
elif re.match("^INT_[LR].IMUX", bn):
|
||||
m = re.match("^INT_[LR].IMUX(_L)?(\d+)", bn)
|
||||
bgcolor = "#88aaff"
|
||||
label = bn[6:9]
|
||||
elif re.match("^INT_[LR].IMUX", bn):
|
||||
m = re.match("^INT_[LR].IMUX(_L)?(\d+)", bn)
|
||||
bgcolor = "#88aaff"
|
||||
label = "IM" + m.group(2)
|
||||
elif re.match("^INT_[LR].BYP_ALT", bn):
|
||||
bgcolor = "#7755ff"
|
||||
label = "BA" + bn[13]
|
||||
elif re.match("^INT_[LR].FAN_ALT", bn):
|
||||
bgcolor = "#4466bb"
|
||||
label = "FA" + bn[13]
|
||||
elif re.match("^INT_[LR].CLK", bn):
|
||||
bgcolor = "#4466bb"
|
||||
label = "CLK"
|
||||
elif re.match("^INT_[LR].CTRL", bn):
|
||||
bgcolor = "#7755ff"
|
||||
label = "CTRL"
|
||||
elif re.match("^INT_[LR].GFAN", bn):
|
||||
bgcolor = "#7755ff"
|
||||
label = "GFAN"
|
||||
elif re.match("^INT_[LR].LVB", bn):
|
||||
bgcolor = "#88aaff"
|
||||
label = "LVB"
|
||||
elif re.match("^INT_[LR].LV", bn):
|
||||
bgcolor = "#88aaff"
|
||||
label = "LV"
|
||||
elif re.match("^INT_[LR].LH", bn):
|
||||
bgcolor = "#4466bb"
|
||||
label = "LH"
|
||||
elif re.match("^CLBL[LM]_[LR].SLICE[LM]_X[01].[ABCD]FF.DMUX", bn):
|
||||
bgcolor = "#88aaff"
|
||||
label = "DMX"
|
||||
elif re.match("^CLBL[LM]_[LR].SLICE[LM]_X[01].[ABCD]MUX", bn):
|
||||
bgcolor = "#aa88ff"
|
||||
label = "OMX"
|
||||
elif re.match("^CLBL[LM]_[LR].SLICE[LM]_X[01].PRECYINIT", bn):
|
||||
bgcolor = "#88aaff"
|
||||
label = "CYI"
|
||||
elif re.match("^HCLK_[LR]", bn) and "_B_BOT" in bn:
|
||||
bgcolor = "#4466bb"
|
||||
label = "BOT"
|
||||
elif re.match("^HCLK_[LR]", bn) and "_B_TOP" in bn:
|
||||
bgcolor = "#7755ff"
|
||||
label = "TOP"
|
||||
piptypes[bit_pos] = label
|
||||
title.append(bn)
|
||||
label = "IM" + m.group(2)
|
||||
elif re.match("^INT_[LR].BYP_ALT", bn):
|
||||
bgcolor = "#7755ff"
|
||||
label = "BA" + bn[13]
|
||||
elif re.match("^INT_[LR].FAN_ALT", bn):
|
||||
bgcolor = "#4466bb"
|
||||
label = "FA" + bn[13]
|
||||
elif re.match("^INT_[LR].CLK", bn):
|
||||
bgcolor = "#4466bb"
|
||||
label = "CLK"
|
||||
elif re.match("^INT_[LR].CTRL", bn):
|
||||
bgcolor = "#7755ff"
|
||||
label = "CTRL"
|
||||
elif re.match("^INT_[LR].GFAN", bn):
|
||||
bgcolor = "#7755ff"
|
||||
label = "GFAN"
|
||||
elif re.match("^INT_[LR].LVB", bn):
|
||||
bgcolor = "#88aaff"
|
||||
label = "LVB"
|
||||
elif re.match("^INT_[LR].LV", bn):
|
||||
bgcolor = "#88aaff"
|
||||
label = "LV"
|
||||
elif re.match("^INT_[LR].LH", bn):
|
||||
bgcolor = "#4466bb"
|
||||
label = "LH"
|
||||
elif re.match("^CLBL[LM]_[LR].SLICE[LM]_X[01].[ABCD]FF.DMUX", bn):
|
||||
bgcolor = "#88aaff"
|
||||
label = "DMX"
|
||||
elif re.match("^CLBL[LM]_[LR].SLICE[LM]_X[01].[ABCD]MUX", bn):
|
||||
bgcolor = "#aa88ff"
|
||||
label = "OMX"
|
||||
elif re.match("^CLBL[LM]_[LR].SLICE[LM]_X[01].PRECYINIT", bn):
|
||||
bgcolor = "#88aaff"
|
||||
label = "CYI"
|
||||
elif re.match("^HCLK_[LR]", bn) and "_B_BOT" in bn:
|
||||
bgcolor = "#4466bb"
|
||||
label = "BOT"
|
||||
elif re.match("^HCLK_[LR]", bn) and "_B_TOP" in bn:
|
||||
bgcolor = "#7755ff"
|
||||
label = "TOP"
|
||||
piptypes[bit_pos] = label
|
||||
title.append(bn)
|
||||
|
||||
if label is None:
|
||||
label = " "
|
||||
|
|
@ -581,7 +552,7 @@ function oml() {
|
|||
known_bits += 1
|
||||
|
||||
print("<td id=\"bit%s\" onmouseenter=\"ome('%s');\" onmouseleave=\"oml();\" bgcolor=\"%s\" align=\"center\" title=\"%s\"%s><span style=\"font-size:10px\">%s</span></td>" %
|
||||
(bit_pos, bit_pos, bgcolor, "\n".join(title), onclick, label), file=f)
|
||||
(bit_pos, bit_pos, bgcolor, "\n".join(title), onclick, label), file=f)
|
||||
print("</tr>", file=f)
|
||||
print("</table>", file=f)
|
||||
|
||||
|
|
@ -591,9 +562,9 @@ function oml() {
|
|||
|
||||
if True:
|
||||
print(" unused: %d, unknown: %d, known: %d, total: %d, percentage: %.2f%% (%.2f%%)" % (
|
||||
unused_bits, unknown_bits, known_bits, unused_bits + unknown_bits + known_bits,
|
||||
100 * known_bits / (unknown_bits + unused_bits + known_bits),
|
||||
100 * (known_bits + unused_bits) / (unknown_bits + unused_bits + known_bits)))
|
||||
unused_bits, unknown_bits, known_bits, unused_bits + unknown_bits + known_bits,
|
||||
100 * known_bits / (unknown_bits + unused_bits + known_bits),
|
||||
100 * (known_bits + unused_bits) / (unknown_bits + unused_bits + known_bits)))
|
||||
|
||||
bits_by_prefix = dict()
|
||||
|
||||
|
|
@ -612,14 +583,12 @@ function oml() {
|
|||
print("<p/>", file=f)
|
||||
print("<h4>%s</h4>" % prefix, file=f)
|
||||
print("<table cellspacing=0>", file=f)
|
||||
print(
|
||||
"<tr><th width=\"400\" align=\"left\">Bit Name</th><th>Position</th></tr>", file=f)
|
||||
print("<tr><th width=\"400\" align=\"left\">Bit Name</th><th>Position</th></tr>", file=f)
|
||||
|
||||
trstyle = ""
|
||||
for bit_name, bit_pos in sorted(bits):
|
||||
trstyle = " bgcolor=\"#dddddd\"" if trstyle == "" else ""
|
||||
print("<tr%s><td>%s</td><td>%s</td></tr>" %
|
||||
(trstyle, bit_name, bit_pos), file=f)
|
||||
print("<tr%s><td>%s</td><td>%s</td></tr>" % (trstyle, bit_name, bit_pos), file=f)
|
||||
|
||||
print("</table>", file=f)
|
||||
|
||||
|
|
@ -694,8 +663,7 @@ function oml() {
|
|||
print("<a id=\"b%s\"/>" % bit, file=f)
|
||||
|
||||
print("<script><!--", file=f)
|
||||
print("grp2bits['%s'] = ['%s'];" %
|
||||
(grp_bits[0], "', '".join(grp_bits)), file=f)
|
||||
print("grp2bits['%s'] = ['%s'];" % (grp_bits[0], "', '".join(grp_bits)), file=f)
|
||||
for bit in grp_bits:
|
||||
print("bit2grp['%s'] = '%s';" % (bit, grp_bits[0]), file=f)
|
||||
print("//--></script>", file=f)
|
||||
|
|
@ -714,10 +682,8 @@ function oml() {
|
|||
line = " --><td>%s</td>" % (pip)
|
||||
for bit in grp_bits:
|
||||
c = "-"
|
||||
if bit in routebits[segtype] and pip in routebits[segtype][bit]:
|
||||
c = "1"
|
||||
if bit in routezbits[segtype] and pip in routezbits[segtype][bit]:
|
||||
c = "0"
|
||||
if bit in routebits[segtype] and pip in routebits[segtype][bit]: c = "1"
|
||||
if bit in routezbits[segtype] and pip in routezbits[segtype][bit]: c = "0"
|
||||
line = "%s%s<td align=\"center\">%s</td>" % (c, line, c)
|
||||
lines.append(line)
|
||||
|
||||
|
|
@ -733,10 +699,8 @@ function oml() {
|
|||
if len(shared_bits[bit]) > 1:
|
||||
if first_note:
|
||||
print("<p><b>Note(s):</b><br/>", file=f)
|
||||
print("Warning: Groups sharing bit %s: %s." %
|
||||
(bit, ", ".join(sorted(shared_bits[bit]))))
|
||||
print("Groups sharing bit <b>%s</b>: %s.<br/>" %
|
||||
(bit, ", ".join(sorted(shared_bits[bit]))), file=f)
|
||||
print("Warning: Groups sharing bit %s: %s." % (bit, ", ".join(sorted(shared_bits[bit]))))
|
||||
print("Groups sharing bit <b>%s</b>: %s.<br/>" % (bit, ", ".join(sorted(shared_bits[bit]))), file=f)
|
||||
first_note = False
|
||||
if not first_note:
|
||||
print("</p>", file=f)
|
||||
|
|
@ -744,15 +708,13 @@ function oml() {
|
|||
for tile_type in segtiles[segtype]:
|
||||
print("<h3>Tile %s Pseudo PIPs</h3>" % tile_type, file=f)
|
||||
print("<table cellspacing=0>", file=f)
|
||||
print(
|
||||
"<tr><th width=\"500\" align=\"left\">PIP</th><th>Type</th></tr>", file=f)
|
||||
print("<tr><th width=\"500\" align=\"left\">PIP</th><th>Type</th></tr>", file=f)
|
||||
trstyle = ""
|
||||
with db_open("ppips_%s.db" % tile_type.lower()) as fi:
|
||||
for line in fi:
|
||||
pip_name, pip_type = line.split()
|
||||
trstyle = " bgcolor=\"#dddddd\"" if trstyle == "" else ""
|
||||
print("<tr%s><td>%s</td><td>%s</td></tr>" %
|
||||
(trstyle, pip_name, pip_type), file=f)
|
||||
print("<tr%s><td>%s</td><td>%s</td></tr>" % (trstyle, pip_name, pip_type), file=f)
|
||||
print("</table>", file=f)
|
||||
|
||||
print("</div>", file=f)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import sys, re
|
||||
|
||||
database = dict()
|
||||
database_r = dict()
|
||||
|
|
@ -25,23 +24,20 @@ for arg in sys.argv[1:]:
|
|||
database[key] = bits
|
||||
database_r[bits] = key
|
||||
|
||||
|
||||
def get_subsets(bits):
|
||||
retval = list()
|
||||
retval.append(bits)
|
||||
for i in range(len(bits)):
|
||||
for s in get_subsets(bits[i + 1:]):
|
||||
retval.append(bits[0:i] + s)
|
||||
for s in get_subsets(bits[i+1:]):
|
||||
retval.append(bits[0:i] + s);
|
||||
return retval
|
||||
|
||||
|
||||
def check_subsets(bits):
|
||||
for sub_bits in sorted(get_subsets(bits)):
|
||||
if sub_bits != bits and sub_bits != ():
|
||||
if sub_bits in database_r:
|
||||
print("Warning: Entry %s %s is a subset of entry %s %s." %
|
||||
(database_r[sub_bits], sub_bits, database_r[bits], bits))
|
||||
|
||||
print("Warning: Entry %s %s is a subset of entry %s %s." % (database_r[sub_bits], sub_bits, database_r[bits], bits))
|
||||
|
||||
for key, bits in database.items():
|
||||
check_subsets(bits)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import sys, os, re
|
||||
|
||||
zero_db = [
|
||||
"00_21 00_22 00_26 01_28|00_25 01_20 01_21 01_24",
|
||||
|
|
@ -33,11 +31,9 @@ zero_db = [
|
|||
"30_53 31_53 31_56 31_57",
|
||||
]
|
||||
|
||||
|
||||
def add_zero_bits(tile_type):
|
||||
assert os.getenv("XRAY_DATABASE") in ["artix7", "kintex7"]
|
||||
dbfile = "%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"),
|
||||
os.getenv("XRAY_DATABASE"), tile_type)
|
||||
dbfile = "%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), tile_type)
|
||||
new_lines = set()
|
||||
llast = None
|
||||
|
||||
|
|
@ -88,11 +84,9 @@ def add_zero_bits(tile_type):
|
|||
for line in sorted(new_lines):
|
||||
print(line, file=f)
|
||||
|
||||
|
||||
def update_mask(mask_db, *src_dbs):
|
||||
bits = set()
|
||||
mask_db_file = "%s/%s/mask_%s.db" % (
|
||||
os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), mask_db)
|
||||
mask_db_file = "%s/%s/mask_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), mask_db)
|
||||
|
||||
if os.path.exists(mask_db_file):
|
||||
with open(mask_db_file, "r") as f:
|
||||
|
|
@ -103,8 +97,7 @@ def update_mask(mask_db, *src_dbs):
|
|||
bits.add(line[1])
|
||||
|
||||
for src_db in src_dbs:
|
||||
seg_db_file = "%s/%s/segbits_%s.db" % (
|
||||
os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), src_db)
|
||||
seg_db_file = "%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), src_db)
|
||||
|
||||
if not os.path.exists(seg_db_file):
|
||||
continue
|
||||
|
|
@ -121,7 +114,6 @@ def update_mask(mask_db, *src_dbs):
|
|||
for bit in sorted(bits):
|
||||
print("bit %s" % bit, file=f)
|
||||
|
||||
|
||||
add_zero_bits("int_l")
|
||||
add_zero_bits("int_r")
|
||||
add_zero_bits("clbll_l")
|
||||
|
|
@ -141,3 +133,4 @@ for k in range(5):
|
|||
update_mask("bram%d_r" % k, "bram%d_r" % k, "int_r")
|
||||
update_mask("dsp%d_l" % k, "dsp%d_l" % k, "int_l")
|
||||
update_mask("dsp%d_r" % k, "dsp%d_r" % k, "int_r")
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,4 @@
|
|||
import os
|
||||
import json
|
||||
import re
|
||||
|
||||
import os, json, re
|
||||
|
||||
class segmaker:
|
||||
def __init__(self, bitsfile):
|
||||
|
|
@ -27,8 +24,7 @@ class segmaker:
|
|||
if bit_wordidx not in self.bits[base_frame]:
|
||||
self.bits[base_frame][bit_wordidx] = set()
|
||||
|
||||
self.bits[base_frame][bit_wordidx].add(
|
||||
(bit_frame, bit_wordidx, bit_bitidx))
|
||||
self.bits[base_frame][bit_wordidx].add((bit_frame, bit_wordidx, bit_bitidx))
|
||||
|
||||
def addtag(self, site, name, value):
|
||||
if site not in self.tags:
|
||||
|
|
@ -54,35 +50,30 @@ class segmaker:
|
|||
segments = self.segments_by_type[segdata["type"]]
|
||||
|
||||
tile_type = tiledata["type"]
|
||||
segname = "%s_%03d" % (
|
||||
segdata["baseaddr"][0][2:], segdata["baseaddr"][1])
|
||||
segname = "%s_%03d" % (segdata["baseaddr"][0][2:], segdata["baseaddr"][1])
|
||||
|
||||
def add_segbits():
|
||||
if not segname in segments:
|
||||
segments[segname] = {"bits": set(), "tags": dict()}
|
||||
segments[segname] = { "bits": set(), "tags": dict() }
|
||||
|
||||
base_frame = int(segdata["baseaddr"][0][2:], 16)
|
||||
for wordidx in range(segdata["baseaddr"][1], segdata["baseaddr"][1] + segdata["words"]):
|
||||
for wordidx in range(segdata["baseaddr"][1], segdata["baseaddr"][1]+segdata["words"]):
|
||||
if base_frame not in self.bits:
|
||||
continue
|
||||
if wordidx not in self.bits[base_frame]:
|
||||
continue
|
||||
for bit_frame, bit_wordidx, bit_bitidx in self.bits[base_frame][wordidx]:
|
||||
bitname_frame = bit_frame - base_frame
|
||||
bitname_bit = 32 * \
|
||||
(bit_wordidx -
|
||||
segdata["baseaddr"][1]) + bit_bitidx
|
||||
bitname_bit = 32*(bit_wordidx - segdata["baseaddr"][1]) + bit_bitidx
|
||||
if bitfilter is None or bitfilter(bitname_frame, bitname_bit):
|
||||
bitname = "%02d_%02d" % (
|
||||
bitname_frame, bitname_bit)
|
||||
bitname = "%02d_%02d" % (bitname_frame, bitname_bit)
|
||||
segments[segname]["bits"].add(bitname)
|
||||
|
||||
if tilename in self.tags:
|
||||
add_segbits()
|
||||
|
||||
for name, value in self.tags[tilename].items():
|
||||
tag = "%s.%s" % (
|
||||
re.sub("(LL|LM)?_[LR]$", "", tile_type), name)
|
||||
tag = "%s.%s" % (re.sub("(LL|LM)?_[LR]$", "", tile_type), name)
|
||||
segments[segname]["tags"][tag] = value
|
||||
|
||||
for site in tiledata["sites"]:
|
||||
|
|
@ -99,8 +90,7 @@ class segmaker:
|
|||
assert 0
|
||||
|
||||
for name, value in self.tags[site].items():
|
||||
tag = "%s.%s.%s" % (
|
||||
re.sub("(LL|LM)?_[LR]$", "", tile_type), sitekey, name)
|
||||
tag = "%s.%s.%s" % (re.sub("(LL|LM)?_[LR]$", "", tile_type), sitekey, name)
|
||||
tag = tag.replace(".SLICEM.", ".")
|
||||
tag = tag.replace(".SLICEL.", ".")
|
||||
segments[segname]["tags"][tag] = value
|
||||
|
|
@ -129,5 +119,5 @@ class segmaker:
|
|||
for bitname in sorted(segdata["bits"]):
|
||||
print("bit %s_%s" % (segname, bitname), file=f)
|
||||
for tagname, tagval in sorted(segdata["tags"].items()):
|
||||
print("tag %s_%s %d" %
|
||||
(segname, tagname, tagval), file=f)
|
||||
print("tag %s_%s %d" % (segname, tagname, tagval), file=f)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,17 +1,12 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import getopt
|
||||
import sys
|
||||
import os
|
||||
import json
|
||||
import re
|
||||
import getopt, sys, os, json, re
|
||||
|
||||
flag_z = False
|
||||
flag_b = False
|
||||
flag_d = False
|
||||
flag_D = False
|
||||
|
||||
|
||||
def usage():
|
||||
print("Usage: %s [options] <bits_file> [segments/tiles]" % sys.argv[0])
|
||||
print("")
|
||||
|
|
@ -29,7 +24,6 @@ def usage():
|
|||
print("")
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
try:
|
||||
opts, args = getopt.getopt(sys.argv[1:], "zbdD")
|
||||
except:
|
||||
|
|
@ -73,7 +67,6 @@ with open(args[0], "r") as f:
|
|||
|
||||
segbitsdb = dict()
|
||||
|
||||
|
||||
def get_database(segtype):
|
||||
if segtype in segbitsdb:
|
||||
return segbitsdb[segtype]
|
||||
|
|
@ -92,17 +85,16 @@ def get_database(segtype):
|
|||
|
||||
return segbitsdb[segtype]
|
||||
|
||||
|
||||
def handle_segment(segname):
|
||||
if segname is None:
|
||||
segframes = dict()
|
||||
for segname, segdata in grid["segments"].items():
|
||||
framebase = int(segdata["baseaddr"][0], 16)
|
||||
for i in range(segdata["frames"]):
|
||||
if (framebase + i) not in segframes:
|
||||
segframes[framebase + i] = set()
|
||||
if (framebase+i) not in segframes:
|
||||
segframes[framebase+i] = set()
|
||||
for j in range(segdata["baseaddr"][1], segdata["baseaddr"][1] + segdata["words"]):
|
||||
segframes[framebase + i].add(j)
|
||||
segframes[framebase+i].add(j)
|
||||
for frame in sorted(bitdata.keys()):
|
||||
for wordidx in sorted(bitdata[frame].keys()):
|
||||
if frame in segframes and wordidx in segframes[frame]:
|
||||
|
|
@ -159,15 +151,14 @@ def handle_segment(segname):
|
|||
segbits = set()
|
||||
segtags = set()
|
||||
|
||||
for frame in range(baseframe, baseframe + numframes):
|
||||
for frame in range(baseframe, baseframe+numframes):
|
||||
if frame not in bitdata:
|
||||
continue
|
||||
for wordidx in range(basewordidx, basewordidx + numwords):
|
||||
for wordidx in range(basewordidx, basewordidx+numwords):
|
||||
if wordidx not in bitdata[frame]:
|
||||
continue
|
||||
for bitidx in bitdata[frame][wordidx]:
|
||||
segbits.add("%02d_%02d" % (frame - baseframe,
|
||||
32 * (wordidx - basewordidx) + bitidx))
|
||||
segbits.add("%02d_%02d" % (frame - baseframe, 32*(wordidx - basewordidx) + bitidx))
|
||||
|
||||
if flag_d or flag_D:
|
||||
for entry in get_database(seginfo["type"]):
|
||||
|
|
@ -194,7 +185,6 @@ def handle_segment(segname):
|
|||
for tag in sorted(segtags):
|
||||
print("tag %s" % tag)
|
||||
|
||||
|
||||
if flag_b:
|
||||
handle_segment(None)
|
||||
|
||||
|
|
@ -207,3 +197,4 @@ if len(args) == 1:
|
|||
else:
|
||||
for arg in args[1:]:
|
||||
handle_segment(arg)
|
||||
|
||||
|
|
|
|||
|
|
@ -3,9 +3,7 @@
|
|||
# Produces a complete database of wires in the ROI and their connections and tests if each
|
||||
# routing node is a tree (i.e. fails with an error when a loop is found).
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import os, sys, json
|
||||
|
||||
with open("%s/%s/tilegrid.json" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")), "r") as f:
|
||||
tilegrid = json.load(f)["tiles"]
|
||||
|
|
@ -21,16 +19,13 @@ for tilename, tiledata in tilegrid.items():
|
|||
key = (tiledata["grid_x"], tiledata["grid_y"])
|
||||
grid[key] = tilename
|
||||
|
||||
|
||||
def check_tileconn_entry(tilename, tiledata, entry, idx):
|
||||
if idx == 0:
|
||||
otheridx = 1
|
||||
otherxy = (tiledata["grid_x"] + entry["grid_deltas"]
|
||||
[0], tiledata["grid_y"] + entry["grid_deltas"][1])
|
||||
otherxy = (tiledata["grid_x"] + entry["grid_deltas"][0], tiledata["grid_y"] + entry["grid_deltas"][1])
|
||||
else:
|
||||
otheridx = 0
|
||||
otherxy = (tiledata["grid_x"] - entry["grid_deltas"]
|
||||
[0], tiledata["grid_y"] - entry["grid_deltas"][1])
|
||||
otherxy = (tiledata["grid_x"] - entry["grid_deltas"][0], tiledata["grid_y"] - entry["grid_deltas"][1])
|
||||
|
||||
if otherxy not in grid:
|
||||
return
|
||||
|
|
@ -42,7 +37,7 @@ def check_tileconn_entry(tilename, tiledata, entry, idx):
|
|||
return
|
||||
|
||||
print(" Found relevant entry (%s %s %d %d): %s" % (entry["tile_types"][0], entry["tile_types"][1],
|
||||
entry["grid_deltas"][0], entry["grid_deltas"][1], othertilename))
|
||||
entry["grid_deltas"][0], entry["grid_deltas"][1], othertilename))
|
||||
|
||||
for pair in entry["wire_pairs"]:
|
||||
wirename = "%s/%s" % (tilename, pair[idx])
|
||||
|
|
@ -59,7 +54,6 @@ def check_tileconn_entry(tilename, tiledata, entry, idx):
|
|||
wirepairs[otherwirename] = set()
|
||||
wirepairs[otherwirename].add(wirename)
|
||||
|
||||
|
||||
for tilename, tiledata in tilegrid.items():
|
||||
print("Connecting wires in tile %s." % tilename)
|
||||
for entry in tileconn:
|
||||
|
|
@ -68,7 +62,6 @@ for tilename, tiledata in tilegrid.items():
|
|||
if entry["tile_types"][1] == tiledata["type"]:
|
||||
check_tileconn_entry(tilename, tiledata, entry, 1)
|
||||
|
||||
|
||||
def check_wire(wire, source):
|
||||
for next_wire in wirepairs[wire]:
|
||||
if next_wire == source:
|
||||
|
|
@ -80,10 +73,10 @@ def check_wire(wire, source):
|
|||
remwires.remove(next_wire)
|
||||
check_wire(next_wire, wire)
|
||||
|
||||
|
||||
while len(remwires):
|
||||
wire = remwires.pop()
|
||||
print("Checking %s:" % wire)
|
||||
check_wire(wire, None)
|
||||
|
||||
print("NO LOOP FOUND: OK")
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import os, sys, json
|
||||
|
||||
if len(sys.argv) != 3:
|
||||
print("Usage example: python3 %s HCLK_R HCLK_SW6E3" % sys.argv[0])
|
||||
|
|
@ -28,11 +26,9 @@ for entry in tileconn:
|
|||
if wire_pair[this_idx] != sys.argv[2]:
|
||||
continue
|
||||
|
||||
outdata.append(
|
||||
(delta_x, delta_y, entry["tile_types"][other_idx], wire_pair[other_idx]))
|
||||
max_tiletype_len = max(max_tiletype_len, len(
|
||||
entry["tile_types"][other_idx]))
|
||||
outdata.append((delta_x, delta_y, entry["tile_types"][other_idx], wire_pair[other_idx]))
|
||||
max_tiletype_len = max(max_tiletype_len, len(entry["tile_types"][other_idx]))
|
||||
|
||||
for entry in outdata:
|
||||
print("%3d %3d %-*s %s" %
|
||||
(entry[0], entry[1], max_tiletype_len, entry[2], entry[3]))
|
||||
print("%3d %3d %-*s %s" % (entry[0], entry[1], max_tiletype_len, entry[2], entry[3]))
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue