Add ZINV bits for REG CLK's.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
This commit is contained in:
Keith Rothman 2019-01-29 15:50:19 -08:00
parent 76af782e3f
commit 890a14e6df
3 changed files with 46 additions and 6 deletions

View File

@ -1,17 +1,20 @@
#!/usr/bin/env python3
import json
import csv
from prjxray.segmaker import Segmaker
from prjxray import verilog
from prjxray import segmaker
def isinv_tags(segmk, ps, site):
def isinv_tags(segmk, ps, site, actual_ps):
# all of these bits are inverted
ks = [
('IS_CLKARDCLK_INVERTED', 'ZINV_CLKARDCLK'),
('IS_CLKBWRCLK_INVERTED', 'ZINV_CLKBWRCLK'),
('IS_REGCLKARDRCLK_INVERTED', 'ZINV_REGCLKARDRCLK'),
('IS_REGCLKB_INVERTED', 'ZINV_REGCLKB'),
('IS_ENARDEN_INVERTED', 'ZINV_ENARDEN'),
('IS_ENBWREN_INVERTED', 'ZINV_ENBWREN'),
('IS_RSTRAMARSTRAM_INVERTED', 'ZINV_RSTRAMARSTRAM'),
@ -19,9 +22,33 @@ def isinv_tags(segmk, ps, site):
('IS_RSTREGARSTREG_INVERTED', 'ZINV_RSTREGARSTREG'),
('IS_RSTREGB_INVERTED', 'ZINV_RSTREGB'),
]
for param, tagname in ks:
segmk.add_site_tag(site, tagname, 1 ^ verilog.parsei(ps[param]))
for param, tagname in ks:
# The CLK inverts sometimes are changed during synthesis, resulting
# in addition inversions. Take this into account.
if param in actual_ps:
tag = 1 ^ verilog.parsei(actual_ps[param])
elif param == 'IS_REGCLKARDRCLK_INVERTED':
if verilog.parsei(ps['DOA_REG']):
# When DOA_REG == 1, REGCLKARDRCLK follows the CLKARDCLK setting.
tag = 1 ^ verilog.parsei(actual_ps['IS_CLKARDCLK_INVERTED'])
else:
# When DOA_REG == 0, REGCLKARDRCLK is always inverted.
tag = 0
segmk.add_site_tag(site, tagname, tag)
elif param == 'IS_REGCLKB_INVERTED':
if verilog.parsei(ps['DOB_REG']):
# When DOB_REG == 1, REGCLKB follows the CLKBWRCLK setting.
tag = 1 ^ verilog.parsei(actual_ps['IS_CLKBWRCLK_INVERTED'])
else:
# When DOB_REG == 0, REGCLKB is always inverted.
tag = 0
else:
tag = 1 ^ verilog.parsei(ps[param])
segmk.add_site_tag(site, tagname, tag)
def bus_tags(segmk, ps, site):
for param in ("DOA_REG", "DOB_REG"):
@ -75,7 +102,11 @@ def write_mode_tags(segmk, ps, site):
def run():
segmk = Segmaker("design.bits")
#segmk.set_def_bt('BLOCK_RAM')
clk_inverts = {}
with open('design.csv', 'r') as f:
for params in csv.DictReader(f):
clk_inverts[params['site']] = params
print("Loading tags")
f = open('params.jl', 'r')
@ -86,7 +117,7 @@ def run():
assert j['module'] == 'my_RAMB18E1'
site = verilog.unquote(ps['LOC'])
isinv_tags(segmk, ps, site)
isinv_tags(segmk, ps, site, clk_inverts[site])
bus_tags(segmk, ps, site)
rw_width_tags(segmk, ps, site)
write_mode_tags(segmk, ps, site)

View File

@ -23,3 +23,13 @@ route_design
write_checkpoint -force design.dcp
write_bitstream -force design.bit
set fp [open "design.csv" "w"]
puts $fp "site,IS_CLKARDCLK_INVERTED,IS_CLKBWRCLK_INVERTED"
foreach ram [get_cells "roi/inst_*/ram"] {
set site [get_sites -of_objects [get_bels -of_objects $ram]]
set IS_CLKARDCLK_INVERTED [get_property IS_CLKARDCLK_INVERTED $ram]
set IS_CLKBWRCLK_INVERTED [get_property IS_CLKBWRCLK_INVERTED $ram]
puts $fp "$site,$IS_CLKARDCLK_INVERTED,$IS_CLKBWRCLK_INVERTED"
}
close $fp

View File

@ -4,7 +4,6 @@ random.seed(int(os.getenv("SEED"), 16))
from prjxray import util
from prjxray import verilog
from prjxray.verilog import vrandbit, vrandbits
import sys
import json