mirror of https://github.com/openXC7/prjxray.git
Fixed solution of CCIOn_USED bits.
Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
This commit is contained in:
parent
f28684c636
commit
08e8d1b118
|
|
@ -125,6 +125,14 @@ def main():
|
|||
if "FREQ_REF" in port:
|
||||
continue
|
||||
|
||||
# It seems that CCIOn_USED is not enabled when a net goes through
|
||||
# FREQ_REFn. Do not emit this tag if this happens.
|
||||
if "CCIO" in port:
|
||||
n = int(port[-1])
|
||||
dst = "HCLK_CMT_MUX_OUT_FREQ_REF{}".format(n)
|
||||
if dst in tiledata[tile]["dsts"]:
|
||||
continue
|
||||
|
||||
if port in tiledata[tile]["dsts"] or port in tiledata[tile]["srcs"]:
|
||||
segmk.add_tile_tag(tile, "{}_USED".format(port), 1)
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -219,16 +219,20 @@ proc make_manual_routes {filename} {
|
|||
continue
|
||||
}
|
||||
|
||||
# Ripup it
|
||||
route_design -unroute -nets [get_nets $net_name]
|
||||
set net [get_nets $net_name]
|
||||
|
||||
# Rip it up
|
||||
set_property -quiet FIXED_ROUTE "" $net
|
||||
set_property IS_ROUTE_FIXED 0 $net
|
||||
route_design -unroute -nets $net
|
||||
|
||||
# Make the route
|
||||
set status [route_via $net_name [list $wire_name] 0]
|
||||
set nodes [get_nodes -of_objects [get_wires $wire_name]]
|
||||
set status [route_via $net_name [list $nodes] 0]
|
||||
|
||||
# Failure, skip manual routing of this net
|
||||
if { $status != 1 } {
|
||||
puts "MANROUTE: Manual routing failed!"
|
||||
set net [get_nets $net_name]
|
||||
set_property -quiet FIXED_ROUTE "" $net
|
||||
set_property IS_ROUTE_FIXED 0 $net
|
||||
continue
|
||||
|
|
|
|||
|
|
@ -84,6 +84,21 @@ class ClockSources(object):
|
|||
self.sources[cmt].append(source)
|
||||
self.source_to_cmt[source] = cmt
|
||||
|
||||
def remove_clock_source(self, source, cmt="ANY"):
|
||||
"""
|
||||
Removes a clock source from the available clock sources list
|
||||
"""
|
||||
if source in self.source_to_cmt:
|
||||
del self.source_to_cmt[source]
|
||||
|
||||
if cmt == "ANY":
|
||||
for sources in self.sources.values():
|
||||
if source in sources:
|
||||
sources.remove(source)
|
||||
else:
|
||||
if source in self.sources[cmt]:
|
||||
self.sources[cmt].remove(source)
|
||||
|
||||
def get_random_source(
|
||||
self, cmt, uses_left_right_routing=False, no_repeats=False):
|
||||
""" Get a random source that is routable to the specific CMT.
|
||||
|
|
@ -423,12 +438,16 @@ module top({inputs});
|
|||
hclks_used_by_cmt[src_cmt].add(src)
|
||||
return src
|
||||
|
||||
# Track used IOB sources
|
||||
used_iob_clks = set()
|
||||
|
||||
if random.random() > .10:
|
||||
for tile_name, site in gen_sites('BUFHCE'):
|
||||
|
||||
wire_name = clock_sources.get_random_source(
|
||||
site_to_cmt[site],
|
||||
uses_left_right_routing=True,
|
||||
no_repeats=mmcm_pll_only or have_iob_clocks)
|
||||
no_repeats=mmcm_pll_only)
|
||||
|
||||
if wire_name is not None and 'BUFHCE' in wire_name:
|
||||
# Looping a BUFHCE to a BUFHCE requires using a hclk in the
|
||||
|
|
@ -440,6 +459,11 @@ module top({inputs});
|
|||
if wire_name is None:
|
||||
continue
|
||||
|
||||
if "IBUF" in wire_name:
|
||||
used_iob_clks.add(wire_name)
|
||||
clock_sources.remove_clock_source(wire_name)
|
||||
adv_clock_sources.remove_clock_source(wire_name)
|
||||
|
||||
print(
|
||||
"""
|
||||
assign I_{site} = {wire_name};""".format(
|
||||
|
|
@ -458,8 +482,25 @@ module top({inputs});
|
|||
print(bufhs.getvalue())
|
||||
|
||||
for _, site in gen_sites('BUFR'):
|
||||
|
||||
# Do not use BUFR always
|
||||
if random.random() < 0.50:
|
||||
continue
|
||||
|
||||
available_srcs = set(iob_clks[site_to_cmt[site]]) - used_iob_clks
|
||||
if len(available_srcs) == 0:
|
||||
continue
|
||||
|
||||
src = random.choice(list(available_srcs))
|
||||
|
||||
if src != "":
|
||||
used_iob_clks.add(src)
|
||||
clock_sources.remove_clock_source(src)
|
||||
adv_clock_sources.remove_clock_source(src)
|
||||
|
||||
adv_clock_sources.add_clock_source(
|
||||
'O_{site}'.format(site=site), site_to_cmt[site])
|
||||
|
||||
print(
|
||||
"""
|
||||
wire O_{site};
|
||||
|
|
@ -467,7 +508,7 @@ module top({inputs});
|
|||
BUFR bufr_{site} (
|
||||
.I({I}),
|
||||
.O(O_{site})
|
||||
);""".format(I=random.choice(iob_clks[site_to_cmt[site]]), site=site))
|
||||
);""".format(I=src, site=site))
|
||||
|
||||
route_file = open("routes.txt", "w")
|
||||
|
||||
|
|
@ -493,8 +534,8 @@ module top({inputs});
|
|||
for _, site in gen_sites('PLLE2_ADV'):
|
||||
for cin in ('cin1', 'cin2', 'clkfbin'):
|
||||
if random.random() > .2:
|
||||
src = adv_clock_sources.get_random_source(
|
||||
site_to_cmt[site], no_repeats=have_iob_clocks)
|
||||
|
||||
src = adv_clock_sources.get_random_source(site_to_cmt[site])
|
||||
|
||||
src_cmt = adv_clock_sources.source_to_cmt[src]
|
||||
|
||||
|
|
@ -507,6 +548,8 @@ module top({inputs});
|
|||
continue
|
||||
|
||||
if "IBUF" in src:
|
||||
clock_sources.remove_clock_source(src)
|
||||
adv_clock_sources.remove_clock_source(src)
|
||||
fix_ccio_route(src)
|
||||
|
||||
print(
|
||||
|
|
@ -517,8 +560,8 @@ module top({inputs});
|
|||
for _, site in gen_sites('MMCME2_ADV'):
|
||||
for cin in ('cin1', 'cin2', 'clkfbin'):
|
||||
if random.random() > .2:
|
||||
src = adv_clock_sources.get_random_source(
|
||||
site_to_cmt[site], no_repeats=have_iob_clocks)
|
||||
|
||||
src = adv_clock_sources.get_random_source(site_to_cmt[site])
|
||||
|
||||
src_cmt = adv_clock_sources.source_to_cmt[src]
|
||||
if 'IBUF' not in src and 'BUFR' not in src:
|
||||
|
|
@ -530,6 +573,8 @@ module top({inputs});
|
|||
continue
|
||||
|
||||
if "IBUF" in src:
|
||||
clock_sources.remove_clock_source(src)
|
||||
adv_clock_sources.remove_clock_source(src)
|
||||
fix_ccio_route(src)
|
||||
|
||||
print(
|
||||
|
|
|
|||
Loading…
Reference in New Issue