mirror of https://github.com/openXC7/prjxray.git
Run make format.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
This commit is contained in:
parent
e7d32dadb4
commit
9ccc58b077
|
|
@ -210,6 +210,7 @@ def propagate_INT_bits_in_column(database, tiles_by_grid):
|
||||||
tile_name = next_tile
|
tile_name = next_tile
|
||||||
tile = database[tile_name]
|
tile = database[tile_name]
|
||||||
|
|
||||||
|
|
||||||
def propagate_rebuf(database, tiles_by_grid):
|
def propagate_rebuf(database, tiles_by_grid):
|
||||||
""" Writing a fuzzer for the CLK_BUFG_REBUF tiles is hard, so propigate from CLK_HROW tiles.
|
""" Writing a fuzzer for the CLK_BUFG_REBUF tiles is hard, so propigate from CLK_HROW tiles.
|
||||||
|
|
||||||
|
|
@ -225,16 +226,21 @@ def propagate_rebuf(database, tiles_by_grid):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
rebuf_below = tiles_by_grid[(tile['grid_x'], tile['grid_y'] - 12)]
|
rebuf_below = tiles_by_grid[(tile['grid_x'], tile['grid_y'] - 12)]
|
||||||
assert database[rebuf_below]['type'] == 'CLK_BUFG_REBUF', database[rebuf_below]['type']
|
assert database[rebuf_below]['type'] == 'CLK_BUFG_REBUF', database[
|
||||||
|
rebuf_below]['type']
|
||||||
rebuf_above = tiles_by_grid[(tile['grid_x'], tile['grid_y'] + 13)]
|
rebuf_above = tiles_by_grid[(tile['grid_x'], tile['grid_y'] + 13)]
|
||||||
assert database[rebuf_above]['type'] == 'CLK_BUFG_REBUF', database[rebuf_below]['type']
|
assert database[rebuf_above]['type'] == 'CLK_BUFG_REBUF', database[
|
||||||
|
rebuf_below]['type']
|
||||||
|
|
||||||
assert database[tile_name]['bits']['CLB_IO_CLK']['offset'] == 47, database[tile_name]['bits']['CLB_IO_CLK']
|
assert database[tile_name]['bits']['CLB_IO_CLK'][
|
||||||
database[rebuf_below]['bits'] = copy.deepcopy(database[tile_name]['bits'])
|
'offset'] == 47, database[tile_name]['bits']['CLB_IO_CLK']
|
||||||
|
database[rebuf_below]['bits'] = copy.deepcopy(
|
||||||
|
database[tile_name]['bits'])
|
||||||
database[rebuf_below]['bits']['CLB_IO_CLK']['offset'] = 73
|
database[rebuf_below]['bits']['CLB_IO_CLK']['offset'] = 73
|
||||||
database[rebuf_below]['bits']['CLB_IO_CLK']['words'] = 4
|
database[rebuf_below]['bits']['CLB_IO_CLK']['words'] = 4
|
||||||
|
|
||||||
database[rebuf_above]['bits'] = copy.deepcopy(database[tile_name]['bits'])
|
database[rebuf_above]['bits'] = copy.deepcopy(
|
||||||
|
database[tile_name]['bits'])
|
||||||
database[rebuf_above]['bits']['CLB_IO_CLK']['offset'] = 24
|
database[rebuf_above]['bits']['CLB_IO_CLK']['offset'] = 24
|
||||||
database[rebuf_above]['bits']['CLB_IO_CLK']['words'] = 4
|
database[rebuf_above]['bits']['CLB_IO_CLK']['words'] = 4
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,39 +25,33 @@ def main():
|
||||||
'INIT_OUT',
|
'INIT_OUT',
|
||||||
'IS_IGNORE0_INVERTED',
|
'IS_IGNORE0_INVERTED',
|
||||||
'IS_IGNORE1_INVERTED',
|
'IS_IGNORE1_INVERTED',
|
||||||
):
|
):
|
||||||
segmk.add_site_tag(
|
segmk.add_site_tag(
|
||||||
row['site'], '{}.{}'.format(base_name, param), row[param])
|
row['site'], '{}.{}'.format(base_name, param), row[param])
|
||||||
|
|
||||||
if row['connect0'] and row['connect1']:
|
if row['connect0'] and row['connect1']:
|
||||||
for param in (
|
for param in ('PRESELECT_I0', ):
|
||||||
'PRESELECT_I0',
|
|
||||||
):
|
|
||||||
segmk.add_site_tag(
|
segmk.add_site_tag(
|
||||||
row['site'], '{}.Z{}'.format(base_name, param), 1 ^ row[param])
|
row['site'], '{}.Z{}'.format(base_name, param),
|
||||||
|
1 ^ row[param])
|
||||||
|
|
||||||
for param in (
|
for param in ('PRESELECT_I1', ):
|
||||||
'PRESELECT_I1',
|
|
||||||
):
|
|
||||||
segmk.add_site_tag(
|
segmk.add_site_tag(
|
||||||
row['site'], '{}.{}'.format(base_name, param), row[param])
|
row['site'], '{}.{}'.format(base_name, param), row[param])
|
||||||
|
|
||||||
if row['connect0']:
|
if row['connect0']:
|
||||||
for param, tag in (
|
for param, tag in (('IS_CE0_INVERTED', 'ZINV_CE0'),
|
||||||
('IS_CE0_INVERTED', 'ZINV_CE0'),
|
('IS_S0_INVERTED', 'ZINV_S0')):
|
||||||
('IS_S0_INVERTED', 'ZINV_S0')
|
|
||||||
):
|
|
||||||
segmk.add_site_tag(
|
segmk.add_site_tag(
|
||||||
row['site'], '{}.{}'.format(base_name, tag), 1 ^ row[param])
|
row['site'], '{}.{}'.format(base_name, tag),
|
||||||
|
1 ^ row[param])
|
||||||
|
|
||||||
if row['connect1']:
|
if row['connect1']:
|
||||||
for param, tag in (
|
for param, tag in (('IS_CE1_INVERTED', 'ZINV_CE1'),
|
||||||
('IS_CE1_INVERTED', 'ZINV_CE1'),
|
('IS_S1_INVERTED', 'ZINV_S1')):
|
||||||
('IS_S1_INVERTED', 'ZINV_S1')
|
|
||||||
):
|
|
||||||
segmk.add_site_tag(
|
segmk.add_site_tag(
|
||||||
row['site'], '{}.{}'.format(base_name, tag), 1 ^ row[param])
|
row['site'], '{}.{}'.format(base_name, tag),
|
||||||
|
1 ^ row[param])
|
||||||
|
|
||||||
segmk.compile()
|
segmk.compile()
|
||||||
segmk.write()
|
segmk.write()
|
||||||
|
|
|
||||||
|
|
@ -87,8 +87,6 @@ module top();
|
||||||
.S1(s1_{site})
|
.S1(s1_{site})
|
||||||
""".format(site=site)
|
""".format(site=site)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
print(
|
print(
|
||||||
'''
|
'''
|
||||||
wire ce0_{site};
|
wire ce0_{site};
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,13 @@ REBUF_GCLK = re.compile('^CLK_BUFG_REBUF_R_CK_GCLK([0-9]+)_BOT$')
|
||||||
|
|
||||||
GCLKS = 32
|
GCLKS = 32
|
||||||
|
|
||||||
|
|
||||||
def gclk_of_wire(wire):
|
def gclk_of_wire(wire):
|
||||||
m = REBUF_GCLK.match(wire)
|
m = REBUF_GCLK.match(wire)
|
||||||
assert m, wire
|
assert m, wire
|
||||||
return int(m.group(1))
|
return int(m.group(1))
|
||||||
|
|
||||||
|
|
||||||
class ClockColumn(object):
|
class ClockColumn(object):
|
||||||
def __init__(self, db_root):
|
def __init__(self, db_root):
|
||||||
db = Database(db_root)
|
db = Database(db_root)
|
||||||
|
|
@ -32,12 +34,15 @@ class ClockColumn(object):
|
||||||
|
|
||||||
tiles_in_gclk_columns.append((loc.grid_y, tile))
|
tiles_in_gclk_columns.append((loc.grid_y, tile))
|
||||||
|
|
||||||
_, self.tiles_in_gclk_columns = zip(*sorted(tiles_in_gclk_columns, key=lambda x: x[0]))
|
_, self.tiles_in_gclk_columns = zip(
|
||||||
|
*sorted(tiles_in_gclk_columns, key=lambda x: x[0]))
|
||||||
|
|
||||||
# Initially all GCLK lines are idle. GCLK lines only exist between
|
# Initially all GCLK lines are idle. GCLK lines only exist between
|
||||||
#CLK_BUFG_REBUF tiles, hence len-1.
|
#CLK_BUFG_REBUF tiles, hence len-1.
|
||||||
for gclk in range(GCLKS):
|
for gclk in range(GCLKS):
|
||||||
self.gclk_columns[gclk] = [False for _ in range(len(self.tiles_in_gclk_columns)-1)]
|
self.gclk_columns[gclk] = [
|
||||||
|
False for _ in range(len(self.tiles_in_gclk_columns) - 1)
|
||||||
|
]
|
||||||
|
|
||||||
def enable_rebuf(self, tile, wire):
|
def enable_rebuf(self, tile, wire):
|
||||||
# Find which REBUF is being activated.
|
# Find which REBUF is being activated.
|
||||||
|
|
@ -47,7 +52,7 @@ class ClockColumn(object):
|
||||||
gclk = gclk_of_wire(wire)
|
gclk = gclk_of_wire(wire)
|
||||||
|
|
||||||
self.gclk_columns[gclk][rebuf_idx] = True
|
self.gclk_columns[gclk][rebuf_idx] = True
|
||||||
self.gclk_columns[gclk][rebuf_idx-1] = True
|
self.gclk_columns[gclk][rebuf_idx - 1] = True
|
||||||
|
|
||||||
def yield_rebuf_state(self):
|
def yield_rebuf_state(self):
|
||||||
""" Yields tile_name, gclk, bool if active above tile, bool if active below tile """
|
""" Yields tile_name, gclk, bool if active above tile, bool if active below tile """
|
||||||
|
|
@ -57,7 +62,7 @@ class ClockColumn(object):
|
||||||
active_above = False
|
active_above = False
|
||||||
|
|
||||||
if idx > 0:
|
if idx > 0:
|
||||||
active_below = self.gclk_columns[gclk][idx-1]
|
active_below = self.gclk_columns[gclk][idx - 1]
|
||||||
|
|
||||||
if idx < len(self.gclk_columns[gclk]):
|
if idx < len(self.gclk_columns[gclk]):
|
||||||
active_above = self.gclk_columns[gclk][idx]
|
active_above = self.gclk_columns[gclk][idx]
|
||||||
|
|
@ -79,7 +84,8 @@ def main():
|
||||||
if 'CLK_BUFG_REBUF' not in line:
|
if 'CLK_BUFG_REBUF' not in line:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
parts = line.replace('{', '').replace('}','').strip().replace('\t', ' ').split(' ')
|
parts = line.replace('{', '').replace('}', '').strip().replace(
|
||||||
|
'\t', ' ').split(' ')
|
||||||
dst = parts[0]
|
dst = parts[0]
|
||||||
pip = parts[3]
|
pip = parts[3]
|
||||||
|
|
||||||
|
|
@ -104,14 +110,19 @@ def main():
|
||||||
b_to_a = wire_a != dst
|
b_to_a = wire_a != dst
|
||||||
a_to_b = not b_to_a
|
a_to_b = not b_to_a
|
||||||
|
|
||||||
segmk.add_tile_tag(tile_from_pip, '{}.{}'.format(wire_a, wire_b), b_to_a)
|
segmk.add_tile_tag(
|
||||||
segmk.add_tile_tag(tile_from_pip, '{}.{}'.format(wire_b, wire_a), a_to_b)
|
tile_from_pip, '{}.{}'.format(wire_a, wire_b), b_to_a)
|
||||||
|
segmk.add_tile_tag(
|
||||||
|
tile_from_pip, '{}.{}'.format(wire_b, wire_a), a_to_b)
|
||||||
|
|
||||||
clock_column.enable_rebuf(tile_from_pip, wire_a)
|
clock_column.enable_rebuf(tile_from_pip, wire_a)
|
||||||
|
|
||||||
for tile, gclk, active_below, active_above in clock_column.yield_rebuf_state():
|
for tile, gclk, active_below, active_above in clock_column.yield_rebuf_state(
|
||||||
segmk.add_tile_tag(tile, 'GCLK{}_ENABLE_ABOVE'.format(gclk), active_above)
|
):
|
||||||
segmk.add_tile_tag(tile, 'GCLK{}_ENABLE_BELOW'.format(gclk), active_below)
|
segmk.add_tile_tag(
|
||||||
|
tile, 'GCLK{}_ENABLE_ABOVE'.format(gclk), active_above)
|
||||||
|
segmk.add_tile_tag(
|
||||||
|
tile, 'GCLK{}_ENABLE_BELOW'.format(gclk), active_below)
|
||||||
|
|
||||||
segmk.compile()
|
segmk.compile()
|
||||||
segmk.write(allow_empty=True)
|
segmk.write(allow_empty=True)
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ def gen_bufhce_sites():
|
||||||
if sites:
|
if sites:
|
||||||
yield tile_name, set(sites)
|
yield tile_name, set(sites)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
print('''
|
print('''
|
||||||
module top();
|
module top();
|
||||||
|
|
@ -78,20 +79,21 @@ module top();
|
||||||
|
|
||||||
opts = []
|
opts = []
|
||||||
for count in range(len(bufhce_sites)):
|
for count in range(len(bufhce_sites)):
|
||||||
for opt in itertools.combinations(bufhce_sites, count+1):
|
for opt in itertools.combinations(bufhce_sites, count + 1):
|
||||||
opts.append(opt)
|
opts.append(opt)
|
||||||
|
|
||||||
for gclk in gclks:
|
for gclk in gclks:
|
||||||
for tile_name, sites in random.choice(opts):
|
for tile_name, sites in random.choice(opts):
|
||||||
for site in sorted(sites):
|
for site in sorted(sites):
|
||||||
print("""
|
print(
|
||||||
|
"""
|
||||||
(* KEEP, DONT_TOUCH, LOC = "{site}" *)
|
(* KEEP, DONT_TOUCH, LOC = "{site}" *)
|
||||||
BUFHCE buf_{site} (
|
BUFHCE buf_{site} (
|
||||||
.I({wire_name})
|
.I({wire_name})
|
||||||
);""".format(
|
);""".format(
|
||||||
site=site,
|
site=site,
|
||||||
wire_name=gclk,
|
wire_name=gclk,
|
||||||
))
|
))
|
||||||
sites.remove(site)
|
sites.remove(site)
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue