mirror of https://github.com/openXC7/prjxray.git
Merge branch 'master' into part_refactor
This commit is contained in:
commit
9cec0d5832
|
|
@ -0,0 +1,6 @@
|
|||
[style]
|
||||
based_on_style = pep8
|
||||
split_before_expression_after_opening_paren = True
|
||||
split_before_first_argument = True
|
||||
split_complex_comprehension = True
|
||||
split_penalty_comprehension = 2100
|
||||
|
|
@ -18,7 +18,8 @@ for line in open('README.md'):
|
|||
found = True
|
||||
|
||||
# Footer
|
||||
contrib.append("""\
|
||||
contrib.append(
|
||||
"""\
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -10,4 +10,4 @@ go:
|
|||
format:
|
||||
find . -name \*.cc -and -not -path './third_party/*' -exec $(CLANG_FORMAT) -style=file -i {} \;
|
||||
find . -name \*.h -and -not -path './third_party/*' -exec $(CLANG_FORMAT) -style=file -i {} \;
|
||||
find . -name \*.py -and -not -path './third_party/*' -exec autopep8 -i {} \;
|
||||
find . -name \*.py -and -not -path './third_party/*' -exec yapf -p -i {} \;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import sys, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import json
|
||||
import re
|
||||
import os, json, re
|
||||
|
||||
#################################################
|
||||
# Loading Raw Source Data
|
||||
|
|
@ -13,7 +11,8 @@ luts = dict()
|
|||
carry = dict()
|
||||
|
||||
print("Loading grid.")
|
||||
with open("../../../gridinfo/grid-%s-db.json" % os.getenv("XRAY_PART"), "r") as f:
|
||||
with open("../../../gridinfo/grid-%s-db.json" % os.getenv("XRAY_PART"),
|
||||
"r") as f:
|
||||
grid = json.load(f)
|
||||
|
||||
print("Loading bits.")
|
||||
|
|
@ -54,13 +53,14 @@ with open("carrydata.txt", "r") as f:
|
|||
line = line.split()
|
||||
assert line[0] not in carry
|
||||
carry[line[0]] = dict()
|
||||
for i, n in enumerate("CYINIT:ZRO:ONE:AX:CIN DI0:AX:O5 DI1:AX:O5 DI2:AX:O5 DI3:AX:O5".split()):
|
||||
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
|
||||
|
||||
|
||||
#################################################
|
||||
# Group per Segment
|
||||
|
||||
|
|
@ -78,7 +78,8 @@ for tilename, tiledata in grid["tiles"].items():
|
|||
continue
|
||||
|
||||
segname = "%s_%02x" % (
|
||||
tiledata["cfgcol"]["BASE_FRAMEID"][2:], min(tiledata["cfgcol"]["WORDS"]))
|
||||
tiledata["cfgcol"]["BASE_FRAMEID"][2:],
|
||||
min(tiledata["cfgcol"]["WORDS"]))
|
||||
|
||||
if not segname in segments:
|
||||
segments[segname] = {"bits": list(), "tags": dict()}
|
||||
|
|
@ -99,7 +100,8 @@ for tilename, tiledata in grid["tiles"].items():
|
|||
tile_type = tiledata["props"]["TYPE"]
|
||||
|
||||
# LUT init bits are in the same position for all CLBL[LM]_[LR] tiles
|
||||
if re.match("^CLBL[LM]_[LR]", tile_type) and "LUT.INIT" in name:
|
||||
if re.match("^CLBL[LM]_[LR]",
|
||||
tile_type) and "LUT.INIT" in name:
|
||||
tile_type = "CLBLX_X"
|
||||
|
||||
segments[segname]["tags"]["%s.%s.%s" %
|
||||
|
|
@ -118,12 +120,14 @@ 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()
|
||||
|
||||
|
||||
#################################################
|
||||
# Print
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -24,11 +22,7 @@ with open("design.txt", "r") as f:
|
|||
pdir = int(pdir)
|
||||
|
||||
if tile not in tiledata:
|
||||
tiledata[tile] = {
|
||||
"pips": set(),
|
||||
"srcs": set(),
|
||||
"dsts": set()
|
||||
}
|
||||
tiledata[tile] = {"pips": set(), "srcs": set(), "dsts": set()}
|
||||
|
||||
if pip in pipdata:
|
||||
assert pipdata[pip] == (src, dst)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
import os, re
|
||||
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
|
|
@ -19,7 +18,9 @@ def maketodo(pipfile, dbfile):
|
|||
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
|
||||
|
|
@ -27,11 +26,7 @@ def handle_design(prefix, second_pass):
|
|||
pdir = int(pdir)
|
||||
|
||||
if tile not in tiledata:
|
||||
tiledata[tile] = {
|
||||
"pips": set(),
|
||||
"srcs": set(),
|
||||
"dsts": set()
|
||||
}
|
||||
tiledata[tile] = {"pips": set(), "srcs": set(), "dsts": set()}
|
||||
|
||||
if pip in pipdata:
|
||||
assert pipdata[pip] == (src, dst)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
import os, re
|
||||
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
|
|
@ -24,7 +23,9 @@ def maketodo(pipfile, dbfile):
|
|||
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,10 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import re
|
||||
|
||||
import os, sys, json, re
|
||||
|
||||
#######################################
|
||||
# Read
|
||||
|
|
@ -24,7 +20,6 @@ for arg in sys.argv[1:]:
|
|||
frame = int(line[5:5 + 8], 16)
|
||||
site_baseaddr[site] = "0x%08x" % (frame & ~0x7f)
|
||||
|
||||
|
||||
#######################################
|
||||
# Create initial database
|
||||
|
||||
|
|
@ -56,7 +51,6 @@ for record in tiles:
|
|||
if framebaseaddr is not None:
|
||||
tile_baseaddr[tile_name] = [framebaseaddr, 0]
|
||||
|
||||
|
||||
#######################################
|
||||
# Add Segments
|
||||
|
||||
|
|
@ -76,13 +70,15 @@ for tile_name, tile_data in database["tiles"].items():
|
|||
|
||||
database["segments"][segment_name] = dict()
|
||||
database["segments"][segment_name]["tiles"] = [
|
||||
tile_name, int_tile_name]
|
||||
tile_name, int_tile_name
|
||||
]
|
||||
database["segments"][segment_name]["type"] = segtype
|
||||
database["segments"][segment_name]["frames"] = 36
|
||||
database["segments"][segment_name]["words"] = 2
|
||||
|
||||
if tile_name in tile_baseaddr:
|
||||
database["segments"][segment_name]["baseaddr"] = tile_baseaddr[tile_name]
|
||||
database["segments"][segment_name]["baseaddr"] = tile_baseaddr[
|
||||
tile_name]
|
||||
|
||||
database["tiles"][tile_name]["segment"] = segment_name
|
||||
database["tiles"][int_tile_name]["segment"] = segment_name
|
||||
|
|
@ -117,25 +113,30 @@ for tile_name, tile_data in database["tiles"].items():
|
|||
|
||||
if k == 0:
|
||||
database["segments"][segment_name]["tiles"] = [
|
||||
tile_name, interface_tile_name, int_tile_name]
|
||||
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"][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["tiles"][interface_tile_name]["segment"] = segment_name
|
||||
interface_tile_name, int_tile_name
|
||||
]
|
||||
database["tiles"][interface_tile_name][
|
||||
"segment"] = segment_name
|
||||
database["tiles"][int_tile_name]["segment"] = segment_name
|
||||
|
||||
|
||||
#######################################
|
||||
# Populate segment base addresses: L/R along INT column
|
||||
|
||||
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"]
|
||||
|
||||
|
|
@ -164,11 +165,11 @@ for segment_name in database["segments"].keys():
|
|||
|
||||
if "baseaddr" in database["segments"][seg]:
|
||||
assert database["segments"][seg]["baseaddr"] == [
|
||||
framebase, wordbase]
|
||||
framebase, wordbase
|
||||
]
|
||||
else:
|
||||
database["segments"][seg]["baseaddr"] = [framebase, wordbase]
|
||||
|
||||
|
||||
#######################################
|
||||
# Populate segment base addresses: Up along INT/HCLK columns
|
||||
|
||||
|
|
@ -180,8 +181,10 @@ 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"]
|
||||
|
||||
|
|
@ -196,7 +199,6 @@ for segment_name in start_segments:
|
|||
segname = database["tiles"][tiles_by_grid[(grid_x, grid_y)]]["segment"]
|
||||
database["segments"][segname]["baseaddr"] = [framebase, wordbase]
|
||||
|
||||
|
||||
#######################################
|
||||
# Write
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import sys, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
'''
|
||||
FDCE Primitive: D Flip-Flop with Clock Enable and Asynchronous Clear
|
||||
FDPE Primitive: D Flip-Flop with Clock Enable and Asynchronous Preset
|
||||
|
|
@ -11,8 +10,7 @@ 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
|
||||
|
|
@ -21,8 +19,8 @@ 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)
|
||||
|
|
@ -104,22 +102,21 @@ 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'))
|
||||
segmk.addtag(site, "FFSYNC", cel_prim in ('FDSE', 'FDRE'))
|
||||
|
||||
# Latch bit
|
||||
# Only applies to LUT6 (non-5) FF's
|
||||
if not is5:
|
||||
segmk.addtag(site, "LATCH", isl(cel_prim))
|
||||
|
||||
'''
|
||||
On name:
|
||||
The primitives you listed have a control input to set the FF value to zero (clear/reset),
|
||||
the other three primitives have a control input that sets the FF value to one.
|
||||
Z => inversion
|
||||
'''
|
||||
segmk.addtag(site, "%s.ZRST" % ff_name,
|
||||
cel_prim in ('FDRE', 'FDCE', 'LDCE'))
|
||||
segmk.addtag(
|
||||
site, "%s.ZRST" % ff_name,
|
||||
cel_prim in ('FDRE', 'FDCE', 'LDCE'))
|
||||
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
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)
|
||||
|
|
@ -9,18 +9,19 @@ def ones(l):
|
|||
|
||||
|
||||
# The complete primitive sets
|
||||
ffprims_fall = ones([
|
||||
'FD',
|
||||
'FDC',
|
||||
'FDCE',
|
||||
'FDE',
|
||||
'FDP',
|
||||
'FDPE',
|
||||
'FDR',
|
||||
'FDRE',
|
||||
'FDS',
|
||||
'FDSE',
|
||||
])
|
||||
ffprims_fall = ones(
|
||||
[
|
||||
'FD',
|
||||
'FDC',
|
||||
'FDCE',
|
||||
'FDE',
|
||||
'FDP',
|
||||
'FDPE',
|
||||
'FDR',
|
||||
'FDRE',
|
||||
'FDS',
|
||||
'FDSE',
|
||||
])
|
||||
ffprims_lall = ones([
|
||||
'LDC',
|
||||
'LDCE',
|
||||
|
|
|
|||
|
|
@ -11,7 +11,8 @@ def slice_xy():
|
|||
# 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'))
|
||||
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))
|
||||
|
||||
|
|
@ -38,7 +39,8 @@ def gen_slices():
|
|||
DIN_N = CLBN * 4
|
||||
DOUT_N = CLBN * 1
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module top(input clk, stb, di, output do);
|
||||
localparam integer DIN_N = %d;
|
||||
localparam integer DOUT_N = %d;
|
||||
|
|
@ -69,8 +71,9 @@ 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]));
|
||||
|
|
@ -84,17 +87,21 @@ for i in range(CLBN):
|
|||
init = random.choice((0, 1))
|
||||
#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))
|
||||
' #(.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))
|
||||
f.write("%d,%s,%s,%s,%d\n" % (i, ffprim, loc, bel, init))
|
||||
print('''endmodule
|
||||
print(
|
||||
'''endmodule
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
''')
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module clb_FD (input clk, input [3:0] din, output dout);
|
||||
parameter LOC="SLICE_X16Y100";
|
||||
parameter BEL="AFF";
|
||||
|
|
|
|||
|
|
@ -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 +9,8 @@ def slice_xy():
|
|||
# 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'))
|
||||
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))
|
||||
|
||||
|
|
@ -33,7 +34,8 @@ def gen_slices():
|
|||
DIN_N = CLBN * 8
|
||||
DOUT_N = CLBN * 8
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module top(input clk, stb, di, output do);
|
||||
localparam integer DIN_N = %d;
|
||||
localparam integer DOUT_N = %d;
|
||||
|
|
@ -66,8 +68,9 @@ 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 = ''
|
||||
|
||||
|
|
@ -79,17 +82,20 @@ 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))
|
||||
' 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()
|
||||
print('''endmodule
|
||||
print(
|
||||
'''endmodule
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
''')
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module clb_N5FFMUX (input clk, input [7:0] din, output [7:0] dout);
|
||||
parameter LOC="SLICE_X22Y100";
|
||||
parameter N=-1;
|
||||
|
|
|
|||
|
|
@ -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 +9,8 @@ def slice_xy():
|
|||
# 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'))
|
||||
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))
|
||||
|
||||
|
|
@ -35,7 +36,8 @@ DOUT_N = CLBN * 8
|
|||
|
||||
lut_bels = ['A6LUT', 'B6LUT', 'C6LUT', 'D6LUT']
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module top(input clk, stb, di, output do);
|
||||
localparam integer DIN_N = %d;
|
||||
localparam integer DOUT_N = %d;
|
||||
|
|
@ -68,8 +70,9 @@ 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 = ''
|
||||
|
||||
|
|
@ -84,17 +87,20 @@ 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))
|
||||
' 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()
|
||||
print('''endmodule
|
||||
print(
|
||||
'''endmodule
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
''')
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module clb_NCY0_MX (input clk, input [7:0] din, output [7:0] dout);
|
||||
parameter LOC="SLICE_X16Y129_FIXME";
|
||||
parameter BEL="A6LUT_FIXME";
|
||||
|
|
|
|||
|
|
@ -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 +9,8 @@ def slice_xy():
|
|||
# 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'))
|
||||
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))
|
||||
|
||||
|
|
@ -32,9 +33,7 @@ def gen_slices():
|
|||
|
||||
DIN_N = CLBN * 4
|
||||
DOUT_N = CLBN * 1
|
||||
ffprims = (
|
||||
'FDRE',
|
||||
)
|
||||
ffprims = ('FDRE', )
|
||||
ff_bels = (
|
||||
'AFF',
|
||||
'A5FF',
|
||||
|
|
@ -46,7 +45,8 @@ ff_bels = (
|
|||
'D5FF',
|
||||
)
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module top(input clk, stb, di, output do);
|
||||
localparam integer DIN_N = %d;
|
||||
localparam integer DOUT_N = %d;
|
||||
|
|
@ -79,8 +79,9 @@ 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,19 +93,23 @@ 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))
|
||||
' #(.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
|
||||
print(
|
||||
'''endmodule
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
''')
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module clb_FDRE (input clk, input [3:0] din, output dout);
|
||||
parameter LOC="SLICE_X16Y114";
|
||||
parameter BEL="AFF";
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -25,7 +23,6 @@ for l in f:
|
|||
which = chr(ord('A') + n)
|
||||
# clb_NFFMUX_AX => AX
|
||||
src = module.replace('clb_NFFMUX_', '')
|
||||
|
||||
'''
|
||||
AFFMUX
|
||||
30_00 30_01 30_02 30_03
|
||||
|
|
@ -65,18 +62,14 @@ 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]
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@ def slice_xy():
|
|||
# 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'))
|
||||
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))
|
||||
|
||||
|
|
@ -33,7 +34,8 @@ def gen_slices():
|
|||
DIN_N = CLBN * 8
|
||||
DOUT_N = CLBN * 8
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module top(input clk, stb, di, output do);
|
||||
localparam integer DIN_N = %d;
|
||||
localparam integer DOUT_N = %d;
|
||||
|
|
@ -66,11 +68,13 @@ 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':
|
||||
|
|
@ -83,17 +87,20 @@ 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))
|
||||
' 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()
|
||||
print('''endmodule
|
||||
print(
|
||||
'''endmodule
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
''')
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module myLUT8 (input clk, input [7:0] din,
|
||||
output lut8o, output lut7bo, output lut7ao,
|
||||
//caro: XOR additional result (main output)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -25,7 +23,6 @@ for l in f:
|
|||
which = chr(ord('A') + n)
|
||||
# clb_NFFMUX_AX => AX
|
||||
src = module.replace('clb_NOUTMUX_', '')
|
||||
|
||||
'''
|
||||
BOUTMUX
|
||||
30_20 30_21 30_22 30_23
|
||||
|
|
@ -65,12 +62,9 @@ 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)
|
||||
|
||||
|
|
@ -82,10 +76,14 @@ 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
|
||||
(30, 55),
|
||||
(31, 55), # D5MA
|
||||
(31, 44),
|
||||
(31, 45), # C5MA
|
||||
(30, 19),
|
||||
(31, 19), # B5MA
|
||||
(30, 9),
|
||||
(31, 8), # A5MA
|
||||
]:
|
||||
return False
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@ def slice_xy():
|
|||
# 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'))
|
||||
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))
|
||||
|
||||
|
|
@ -33,7 +34,8 @@ def gen_slices():
|
|||
DIN_N = CLBN * 8
|
||||
DOUT_N = CLBN * 8
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module top(input clk, stb, di, output do);
|
||||
localparam integer DIN_N = %d;
|
||||
localparam integer DOUT_N = %d;
|
||||
|
|
@ -66,8 +68,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):
|
||||
# Don't have an O6 example
|
||||
modules = ['clb_NOUTMUX_' + x for x in ['CY', 'F78', 'O5', 'XOR', 'B5Q']]
|
||||
|
|
@ -83,17 +86,20 @@ 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))
|
||||
' 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()
|
||||
print('''endmodule
|
||||
print(
|
||||
'''endmodule
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
''')
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module myLUT8 (input clk, input [7:0] din,
|
||||
output lut8o, output lut7bo, output lut7ao,
|
||||
//caro: XOR additional result (main output)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -16,7 +14,6 @@ for l in f:
|
|||
module, loc, loc2 = l.split(',')
|
||||
# clb_PRECYINIT_AX => AX
|
||||
src = module.replace('clb_PRECYINIT_', '')
|
||||
|
||||
'''
|
||||
PRECYINIT
|
||||
00_12 30_14 30_13
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@ def slice_xy():
|
|||
# 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'))
|
||||
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))
|
||||
|
||||
|
|
@ -23,10 +24,9 @@ print('//SLICEY: %s' % str(SLICEY))
|
|||
print('//SLICEN: %s' % str(SLICEN))
|
||||
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):
|
||||
|
|
@ -37,7 +37,8 @@ def gen_slices():
|
|||
DIN_N = CLBN * 8
|
||||
DOUT_N = CLBN * 8
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module top(input clk, stb, di, output do);
|
||||
localparam integer DIN_N = %d;
|
||||
localparam integer DOUT_N = %d;
|
||||
|
|
@ -70,8 +71,9 @@ 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']]
|
||||
|
|
@ -96,17 +98,20 @@ 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))
|
||||
' 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()
|
||||
print('''endmodule
|
||||
print(
|
||||
'''endmodule
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
''')
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module clb_PRECYINIT_0 (input clk, input [7:0] din, output [7:0] dout);
|
||||
parameter LOC="SLICE_FIXME";
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -42,8 +40,9 @@ for l in f:
|
|||
l = l.strip()
|
||||
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)
|
||||
|
|
@ -93,7 +92,8 @@ for l in f:
|
|||
]
|
||||
|
||||
# Always use all 4 sites
|
||||
if module in ('my_RAM32M', 'my_RAM64M', 'my_RAM128X1D', 'my_RAM256X1S'):
|
||||
if module in ('my_RAM32M', 'my_RAM64M', 'my_RAM128X1D',
|
||||
'my_RAM256X1S'):
|
||||
ram = [1, 1, 1, 1]
|
||||
# Only can occupy CD I guess
|
||||
elif module == 'my_RAM32X1D':
|
||||
|
|
@ -105,10 +105,10 @@ for l in f:
|
|||
elif module in ('my_RAM32X1S_N', 'my_RAM64X1S_N'):
|
||||
ram = pack4[n - 1]
|
||||
else:
|
||||
assert(0)
|
||||
assert (0)
|
||||
|
||||
# All entries here requiare D
|
||||
assert(ram[3])
|
||||
assert (ram[3])
|
||||
|
||||
if module == 'my_RAM32X1D':
|
||||
# Occupies CD
|
||||
|
|
@ -119,7 +119,7 @@ for l in f:
|
|||
elif module == 'my_RAM32X1S_N':
|
||||
size = pack4[n - 1]
|
||||
else:
|
||||
assert(not module.startswith('my_RAM32'))
|
||||
assert (not module.startswith('my_RAM32'))
|
||||
|
||||
# Now commit bits after marking 1's
|
||||
for beli, bel in enumerate('ABCD'):
|
||||
|
|
|
|||
|
|
@ -26,7 +26,8 @@ def slice_xy():
|
|||
# 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'))
|
||||
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))
|
||||
|
||||
|
|
@ -40,10 +41,9 @@ print('//SLICEY: %s' % str(SLICEY))
|
|||
print('//SLICEN: %s' % str(SLICEN))
|
||||
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:
|
||||
|
|
@ -55,18 +55,19 @@ def gen_slicems():
|
|||
x = 6, 8, 10, 12, 14
|
||||
'''
|
||||
# TODO: generate this from DB
|
||||
assert((12, 28) == SLICEX)
|
||||
assert ((12, 28) == SLICEX)
|
||||
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)
|
||||
|
||||
|
||||
DIN_N = CLBN * 8
|
||||
DOUT_N = CLBN * 8
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module top(input clk, stb, di, output do);
|
||||
localparam integer DIN_N = %d;
|
||||
localparam integer DOUT_N = %d;
|
||||
|
|
@ -99,8 +100,9 @@ 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)
|
||||
|
|
@ -141,15 +143,15 @@ for clbi in range(CLBN):
|
|||
else:
|
||||
modules = [
|
||||
# (module, N max, FF opt)
|
||||
('my_RAM32X1S_N', 4, 0),
|
||||
('my_RAM32X1D', None, 0),
|
||||
('my_RAM32M', None, 0),
|
||||
('my_RAM64X1S_N', 4, 0),
|
||||
('my_RAM64X1D_N', 2, 0),
|
||||
('my_RAM64M', None, 0),
|
||||
('my_RAM128X1S_N', 2, 1),
|
||||
('my_RAM128X1D', None, 1),
|
||||
('my_RAM256X1S', None, 1),
|
||||
('my_RAM32X1S_N', 4, 0),
|
||||
('my_RAM32X1D', None, 0),
|
||||
('my_RAM32M', None, 0),
|
||||
('my_RAM64X1S_N', 4, 0),
|
||||
('my_RAM64X1D_N', 2, 0),
|
||||
('my_RAM64M', None, 0),
|
||||
('my_RAM128X1S_N', 2, 1),
|
||||
('my_RAM128X1D', None, 1),
|
||||
('my_RAM256X1S', None, 1),
|
||||
]
|
||||
|
||||
module, nmax, ff_param = random.choice(modules)
|
||||
|
|
@ -171,18 +173,21 @@ 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()
|
||||
print('''endmodule
|
||||
print(
|
||||
'''endmodule
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
''')
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
|
||||
//***************************************************************
|
||||
//Basic
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@ def slice_xy():
|
|||
# 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'))
|
||||
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))
|
||||
|
||||
|
|
@ -23,10 +24,9 @@ print('//SLICEY: %s' % str(SLICEY))
|
|||
print('//SLICEN: %s' % str(SLICEN))
|
||||
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:
|
||||
|
|
@ -38,18 +38,19 @@ def gen_slicems():
|
|||
x = 6, 8, 10, 12, 14
|
||||
'''
|
||||
# TODO: generate this from DB
|
||||
assert((12, 28) == SLICEX)
|
||||
assert ((12, 28) == SLICEX)
|
||||
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)
|
||||
|
||||
|
||||
DIN_N = CLBN * 8
|
||||
DOUT_N = CLBN * 8
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module top(input clk, stb, di, output do);
|
||||
localparam integer DIN_N = %d;
|
||||
localparam integer DOUT_N = %d;
|
||||
|
|
@ -82,8 +83,9 @@ 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,20 +95,24 @@ 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()
|
||||
print('''endmodule
|
||||
print(
|
||||
'''endmodule
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
''')
|
||||
|
||||
print('''
|
||||
print(
|
||||
'''
|
||||
module my_NDI1MUX_NI_NMC31 (input clk, input [7:0] din, output [7:0] dout);
|
||||
parameter LOC = "SLICE_X6Y100";
|
||||
parameter C31 = 0;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import sys, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
|
@ -23,11 +22,7 @@ with open("design.txt", "r") as f:
|
|||
pdir = int(pdir)
|
||||
|
||||
if tile not in tiledata:
|
||||
tiledata[tile] = {
|
||||
"pips": set(),
|
||||
"srcs": set(),
|
||||
"dsts": set()
|
||||
}
|
||||
tiledata[tile] = {"pips": set(), "srcs": set(), "dsts": set()}
|
||||
|
||||
if pip in pipdata:
|
||||
assert pipdata[pip] == (src, dst)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -24,11 +22,7 @@ with open("design.txt", "r") as f:
|
|||
pdir = int(pdir)
|
||||
|
||||
if tile not in tiledata:
|
||||
tiledata[tile] = {
|
||||
"pips": set(),
|
||||
"srcs": set(),
|
||||
"dsts": set()
|
||||
}
|
||||
tiledata[tile] = {"pips": set(), "srcs": set(), "dsts": set()}
|
||||
|
||||
if pip in pipdata:
|
||||
assert pipdata[pip] == (src, dst)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
import os, re
|
||||
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
|
|
@ -15,11 +14,14 @@ def maketodo(pipfile, dbfile):
|
|||
line = line.split()
|
||||
todos.remove(line[0])
|
||||
for line in todos:
|
||||
if re.match(r"^INT_[LR].IMUX(_L)?[0-9]+\.LOGIC_OUTS(_L)?[0-9]+$", line):
|
||||
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
|
||||
|
|
@ -24,11 +22,7 @@ with open("design.txt", "r") as f:
|
|||
pdir = int(pdir)
|
||||
|
||||
if tile not in tiledata:
|
||||
tiledata[tile] = {
|
||||
"pips": set(),
|
||||
"srcs": set(),
|
||||
"dsts": set()
|
||||
}
|
||||
tiledata[tile] = {"pips": set(), "srcs": set(), "dsts": set()}
|
||||
|
||||
if pip in pipdata:
|
||||
assert pipdata[pip] == (src, dst)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
import os, re
|
||||
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
|
|
@ -19,7 +18,9 @@ def maketodo(pipfile, dbfile):
|
|||
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
|
||||
|
|
@ -24,11 +22,7 @@ with open("design.txt", "r") as f:
|
|||
pdir = int(pdir)
|
||||
|
||||
if tile not in tiledata:
|
||||
tiledata[tile] = {
|
||||
"pips": set(),
|
||||
"srcs": set(),
|
||||
"dsts": set()
|
||||
}
|
||||
tiledata[tile] = {"pips": set(), "srcs": set(), "dsts": set()}
|
||||
|
||||
if pip in pipdata:
|
||||
assert pipdata[pip] == (src, dst)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
import os, re
|
||||
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
|
|
@ -19,7 +18,9 @@ def maketodo(pipfile, dbfile):
|
|||
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
|
||||
|
|
@ -24,11 +22,7 @@ with open("design.txt", "r") as f:
|
|||
pdir = int(pdir)
|
||||
|
||||
if tile not in tiledata:
|
||||
tiledata[tile] = {
|
||||
"pips": set(),
|
||||
"srcs": set(),
|
||||
"dsts": set()
|
||||
}
|
||||
tiledata[tile] = {"pips": set(), "srcs": set(), "dsts": set()}
|
||||
|
||||
if pip in pipdata:
|
||||
assert pipdata[pip] == (src, dst)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
import os, re
|
||||
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
|
|
@ -15,11 +14,14 @@ def maketodo(pipfile, dbfile):
|
|||
line = line.split()
|
||||
todos.remove(line[0])
|
||||
for line in todos:
|
||||
if re.match(r"^INT_[LR].GFAN", line) and not line.endswith(".GND_WIRE"):
|
||||
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
|
||||
|
|
@ -24,11 +22,7 @@ with open("design.txt", "r") as f:
|
|||
pdir = int(pdir)
|
||||
|
||||
if tile not in tiledata:
|
||||
tiledata[tile] = {
|
||||
"pips": set(),
|
||||
"srcs": set(),
|
||||
"dsts": set()
|
||||
}
|
||||
tiledata[tile] = {"pips": set(), "srcs": set(), "dsts": set()}
|
||||
|
||||
if pip in pipdata:
|
||||
assert pipdata[pip] == (src, dst)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -31,11 +29,7 @@ with open("design.txt", "r") as f:
|
|||
pdir = int(pdir)
|
||||
|
||||
if tile not in tiledata:
|
||||
tiledata[tile] = {
|
||||
"pips": set(),
|
||||
"srcs": set(),
|
||||
"dsts": set()
|
||||
}
|
||||
tiledata[tile] = {"pips": set(), "srcs": set(), "dsts": set()}
|
||||
|
||||
if pip in pipdata:
|
||||
assert pipdata[pip] == (src, dst)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
import os, re
|
||||
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
|
|
@ -19,7 +18,9 @@ def maketodo(pipfile, dbfile):
|
|||
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
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
import os, re
|
||||
|
||||
|
||||
def maketodo(pipfile, dbfile):
|
||||
|
|
@ -19,7 +18,9 @@ def maketodo(pipfile, dbfile):
|
|||
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
|
||||
|
|
|
|||
|
|
@ -1,16 +1,14 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import re
|
||||
import os, sys, json, re
|
||||
|
||||
tilenodes = dict()
|
||||
grid2tile = dict()
|
||||
database = dict()
|
||||
|
||||
print("Loading %s grid." % os.getenv("XRAY_DATABASE"))
|
||||
with open("%s/%s/tilegrid.json" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")), "r") as f:
|
||||
with open("%s/%s/tilegrid.json" % (os.getenv("XRAY_DATABASE_DIR"),
|
||||
os.getenv("XRAY_DATABASE")), "r") as f:
|
||||
grid = json.load(f)
|
||||
|
||||
for tile, tiledata in grid["tiles"].items():
|
||||
|
|
@ -31,34 +29,22 @@ with open("nodewires.txt") as f:
|
|||
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
|
||||
|
|
@ -66,17 +52,14 @@ def filter_pair(type1, type2, wire1, wire2, delta_x, delta_y):
|
|||
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 +70,9 @@ 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()
|
||||
|
||||
|
|
|
|||
|
|
@ -97,12 +97,12 @@ for site, bit in db_site_bit.items():
|
|||
tile = db_site_tile[this_site]
|
||||
|
||||
word = bit_word + 2 * i
|
||||
if word >= 50:
|
||||
word += 1
|
||||
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
|
||||
|
|
@ -111,14 +111,16 @@ for site, bit in db_site_bit.items():
|
|||
|
||||
database["tiles"][tile]["cfgcol"] = entry
|
||||
|
||||
if database["tiles"][tile]["props"]["TILE_TYPE"] in ("CLBLL_L", "CLBLM_L"):
|
||||
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)]
|
||||
|
||||
database["tiles"][right_tile]["cfgcol"] = entry
|
||||
|
||||
if database["tiles"][tile]["props"]["TILE_TYPE"] in ("CLBLL_R", "CLBLM_R"):
|
||||
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)]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -11,10 +8,12 @@ import argparse
|
|||
parser = argparse.ArgumentParser(
|
||||
description="Generate a pretty HTML version of the documentation.")
|
||||
parser.add_argument(
|
||||
'--output', default=os.path.join(os.path.curdir, 'html'),
|
||||
'--output',
|
||||
default=os.path.join(os.path.curdir, 'html'),
|
||||
help='Put the generated files in this directory (default current dir).')
|
||||
parser.add_argument(
|
||||
'--settings', default=None,
|
||||
'--settings',
|
||||
default=None,
|
||||
help='Read the settings from file (default to environment).')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
|
@ -23,7 +22,8 @@ if args.settings:
|
|||
settings_filename = args.settings
|
||||
|
||||
settings = {
|
||||
'XRAY_DATABASE_DIR': os.path.abspath(
|
||||
'XRAY_DATABASE_DIR':
|
||||
os.path.abspath(
|
||||
os.path.join(os.path.dirname(settings_filename), '..')),
|
||||
}
|
||||
with open(settings_filename) as f:
|
||||
|
|
@ -37,11 +37,13 @@ if args.settings:
|
|||
def get_setting(name):
|
||||
return settings[name]
|
||||
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):
|
||||
|
|
@ -91,10 +93,12 @@ 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))
|
||||
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))
|
||||
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))
|
||||
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))
|
||||
|
||||
clb_left_bits = set()
|
||||
clb_right_bits = set()
|
||||
|
|
@ -151,7 +155,6 @@ routebits = dict()
|
|||
routezbits = dict()
|
||||
maskbits = dict()
|
||||
|
||||
|
||||
print("Loading tilegrid.")
|
||||
with db_open("tilegrid.json") as f:
|
||||
data = f.read()
|
||||
|
|
@ -218,7 +221,8 @@ for segname, segdata in grid["segments"].items():
|
|||
print(" loading %s segbits." % int_tile_type)
|
||||
with db_open("segbits_%s.db" % int_tile_type) as f:
|
||||
for line in f:
|
||||
if segtype in ["hclk_l", "hclk_r"] and ".ENABLE_BUFFER." in line:
|
||||
if segtype in ["hclk_l", "hclk_r"
|
||||
] and ".ENABLE_BUFFER." in line:
|
||||
add_single_bit(line)
|
||||
else:
|
||||
add_pip_bits(line)
|
||||
|
|
@ -229,7 +233,6 @@ for segname, segdata in grid["segments"].items():
|
|||
_, bit = line.split()
|
||||
maskbits[segtype].add(bit)
|
||||
|
||||
|
||||
#################################################
|
||||
# Create Tilegrid Page
|
||||
|
||||
|
|
@ -237,13 +240,19 @@ 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"]
|
||||
|
|
@ -269,14 +278,10 @@ with out_open("index.html") as f:
|
|||
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"
|
||||
|
|
@ -302,47 +307,64 @@ 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)
|
||||
print(
|
||||
"<a style=\"text-decoration: none; color: black\" href=\"seg_%s.html\">%s</a></span></td>"
|
||||
% (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)
|
||||
|
||||
print("</table>", file=f)
|
||||
print("</body></html>", file=f)
|
||||
|
||||
|
||||
#################################################
|
||||
# Create Segment Pages
|
||||
|
||||
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)
|
||||
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)
|
||||
|
||||
print("""
|
||||
print(
|
||||
"""
|
||||
<script><!--
|
||||
var grp2bits = { };
|
||||
var bit2grp = { }
|
||||
|
|
@ -378,7 +400,8 @@ function oml() {
|
|||
highlight_bits.length = 0;
|
||||
}
|
||||
//--></script>
|
||||
""", file=f)
|
||||
""",
|
||||
file=f)
|
||||
|
||||
print("<table border>", file=f)
|
||||
|
||||
|
|
@ -390,17 +413,23 @@ 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):
|
||||
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)
|
||||
"<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
|
||||
bit_name = segbits_r[segtype][bit_pos] if bit_pos in segbits_r[
|
||||
segtype] else None
|
||||
|
||||
label = None
|
||||
title = [bit_pos]
|
||||
|
|
@ -548,13 +577,19 @@ function oml() {
|
|||
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):
|
||||
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):
|
||||
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):
|
||||
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:
|
||||
|
|
@ -580,8 +615,12 @@ function oml() {
|
|||
else:
|
||||
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)
|
||||
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)
|
||||
print("</tr>", file=f)
|
||||
print("</table>", file=f)
|
||||
|
||||
|
|
@ -590,10 +629,14 @@ function oml() {
|
|||
print("<h3>Segment Configuration Bits</h3>", file=f)
|
||||
|
||||
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)))
|
||||
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)))
|
||||
|
||||
bits_by_prefix = dict()
|
||||
|
||||
|
|
@ -613,13 +656,16 @@ function oml() {
|
|||
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)
|
||||
"<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 +740,10 @@ 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)
|
||||
|
|
@ -733,10 +781,13 @@ 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)
|
||||
|
|
@ -745,14 +796,17 @@ function oml() {
|
|||
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)
|
||||
"<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 +1,2 @@
|
|||
autopep8
|
||||
yapf
|
||||
futures
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import re
|
||||
import sys, re
|
||||
|
||||
database = dict()
|
||||
database_r = dict()
|
||||
|
|
@ -39,8 +38,9 @@ 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():
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
@ -36,8 +34,8 @@ zero_db = [
|
|||
|
||||
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
|
||||
|
||||
|
|
|
|||
|
|
@ -1,12 +1,11 @@
|
|||
import os
|
||||
import json
|
||||
import re
|
||||
import os, json, re
|
||||
|
||||
|
||||
class segmaker:
|
||||
def __init__(self, bitsfile):
|
||||
print("Loading %s grid." % os.getenv("XRAY_DATABASE"))
|
||||
with open("../../../database/%s/tilegrid.json" % os.getenv("XRAY_DATABASE"), "r") as f:
|
||||
with open("../../../database/%s/tilegrid.json" %
|
||||
os.getenv("XRAY_DATABASE"), "r") as f:
|
||||
self.grid = json.load(f)
|
||||
|
||||
self.bits = dict()
|
||||
|
|
@ -62,17 +61,21 @@ class segmaker:
|
|||
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]:
|
||||
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
|
||||
if bitfilter is None or bitfilter(bitname_frame, bitname_bit):
|
||||
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)
|
||||
segments[segname]["bits"].add(bitname)
|
||||
|
|
@ -129,5 +132,6 @@ 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,10 +1,6 @@
|
|||
#!/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
|
||||
|
|
@ -50,7 +46,8 @@ for o, a in opts:
|
|||
else:
|
||||
usage()
|
||||
|
||||
with open("%s/%s/tilegrid.json" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")), "r") as f:
|
||||
with open("%s/%s/tilegrid.json" % (os.getenv("XRAY_DATABASE_DIR"),
|
||||
os.getenv("XRAY_DATABASE")), "r") as f:
|
||||
grid = json.load(f)
|
||||
|
||||
bitdata = dict()
|
||||
|
|
@ -80,12 +77,16 @@ def get_database(segtype):
|
|||
|
||||
segbitsdb[segtype] = list()
|
||||
|
||||
with open("%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), segtype), "r") as f:
|
||||
with open("%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"),
|
||||
os.getenv("XRAY_DATABASE"), segtype),
|
||||
"r") as f:
|
||||
for line in f:
|
||||
line = line.split()
|
||||
segbitsdb[segtype].append(line)
|
||||
|
||||
with open("%s/%s/segbits_int_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), segtype[-1]), "r") as f:
|
||||
with open("%s/%s/segbits_int_%s.db" %
|
||||
(os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"),
|
||||
segtype[-1]), "r") as f:
|
||||
for line in f:
|
||||
line = line.split()
|
||||
segbitsdb[segtype].append(line)
|
||||
|
|
@ -101,7 +102,8 @@ def handle_segment(segname):
|
|||
for i in range(segdata["frames"]):
|
||||
if (framebase + i) not in segframes:
|
||||
segframes[framebase + i] = set()
|
||||
for j in range(segdata["baseaddr"][1], segdata["baseaddr"][1] + segdata["words"]):
|
||||
for j in range(segdata["baseaddr"][1],
|
||||
segdata["baseaddr"][1] + segdata["words"]):
|
||||
segframes[framebase + i].add(j)
|
||||
for frame in sorted(bitdata.keys()):
|
||||
for wordidx in sorted(bitdata[frame].keys()):
|
||||
|
|
@ -166,8 +168,9 @@ def handle_segment(segname):
|
|||
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"]):
|
||||
|
|
|
|||
|
|
@ -3,14 +3,14 @@
|
|||
# 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:
|
||||
with open("%s/%s/tilegrid.json" % (os.getenv("XRAY_DATABASE_DIR"),
|
||||
os.getenv("XRAY_DATABASE")), "r") as f:
|
||||
tilegrid = json.load(f)["tiles"]
|
||||
|
||||
with open("%s/%s/tileconn.json" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")), "r") as f:
|
||||
with open("%s/%s/tileconn.json" % (os.getenv("XRAY_DATABASE_DIR"),
|
||||
os.getenv("XRAY_DATABASE")), "r") as f:
|
||||
tileconn = json.load(f)
|
||||
|
||||
grid = dict()
|
||||
|
|
@ -25,12 +25,14 @@ for tilename, tiledata in tilegrid.items():
|
|||
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
|
||||
|
|
@ -41,8 +43,10 @@ def check_tileconn_entry(tilename, tiledata, entry, idx):
|
|||
if othertiledata["type"] != entry["tile_types"][otheridx]:
|
||||
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))
|
||||
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))
|
||||
|
||||
for pair in entry["wire_pairs"]:
|
||||
wirename = "%s/%s" % (tilename, pair[idx])
|
||||
|
|
|
|||
|
|
@ -1,14 +1,13 @@
|
|||
#!/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])
|
||||
sys.exit(1)
|
||||
|
||||
with open("%s/%s/tileconn.json" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")), "r") as f:
|
||||
with open("%s/%s/tileconn.json" % (os.getenv("XRAY_DATABASE_DIR"),
|
||||
os.getenv("XRAY_DATABASE")), "r") as f:
|
||||
tileconn = json.load(f)
|
||||
|
||||
outdata = list()
|
||||
|
|
@ -29,10 +28,13 @@ for entry in tileconn:
|
|||
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]))
|
||||
(
|
||||
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