Merge branch 'master' into part_refactor

This commit is contained in:
Rick Altherr 2018-01-12 10:49:19 -08:00 committed by GitHub
commit 9cec0d5832
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
55 changed files with 552 additions and 501 deletions

6
.style.yapf Normal file
View File

@ -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

View File

@ -18,7 +18,8 @@ for line in open('README.md'):
found = True
# Footer
contrib.append("""\
contrib.append(
"""\

View File

@ -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 {} \;

View File

@ -1,7 +1,6 @@
#!/usr/bin/env python3
import sys
import re
import sys, re
sys.path.append("../../../utils/")
from segmaker import segmaker

View File

@ -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

View File

@ -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)

View File

@ -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")))

View File

@ -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)

View File

@ -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")))

View File

@ -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

View File

@ -1,7 +1,6 @@
#!/usr/bin/env python3
import sys
import re
import sys, re
sys.path.append("../../../utils/")
from segmaker import segmaker

View File

@ -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()

View File

@ -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',

View File

@ -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";

View File

@ -1,7 +1,6 @@
#!/usr/bin/env python3
import sys
import re
import sys, re
sys.path.append("../../../utils/")
from segmaker import segmaker

View File

@ -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;

View File

@ -1,7 +1,6 @@
#!/usr/bin/env python3
import sys
import re
import sys, re
sys.path.append("../../../utils/")
from segmaker import segmaker

View File

@ -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";

View File

@ -1,7 +1,6 @@
#!/usr/bin/env python3
import sys
import re
import sys, re
sys.path.append("../../../utils/")
from segmaker import segmaker

View File

@ -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";

View File

@ -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]

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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";

View File

@ -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'):

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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)

View File

@ -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)

View File

@ -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")))

View File

@ -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)

View File

@ -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")))

View File

@ -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)

View File

@ -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")))

View File

@ -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)

View File

@ -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")))

View File

@ -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)

View File

@ -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)

View File

@ -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")))

View File

@ -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

View File

@ -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")))

View File

@ -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

View File

@ -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()

View File

@ -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)]

View File

@ -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)

View File

@ -1 +1,2 @@
autopep8
yapf
futures

View File

@ -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():

View File

@ -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

View File

@ -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)

View File

@ -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"]):

View File

@ -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])

View File

@ -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]))