|  | #!/usr/bin/env python3 | 
|  | """ | 
|  | The way this works is as follows; | 
|  |  | 
|  | Loop over all possible "wires" and work out; | 
|  |  | 
|  | * If the wire is an actual wire or a pin | 
|  | * A unique, descriptive name | 
|  |  | 
|  | For each wire, we then work out which channel the wire should be assigned too. | 
|  | We build up the channels as follows; | 
|  |  | 
|  | X Channel | 
|  | Span 4 Tracks | 
|  | Empty | 
|  | Span 12 Tracks | 
|  | Empty | 
|  | Global Tracks | 
|  |  | 
|  | Y Channel | 
|  | Empty | 
|  | Local Tracks | 
|  | Empty | 
|  | Neighbour Tracks | 
|  | Empty | 
|  | Span 4 Tracks | 
|  | Empty | 
|  | Span 12 Tracks | 
|  | Empty | 
|  | Global Tracks | 
|  |  | 
|  | We use the Y channels for the Local + Neighbour track because we have cells | 
|  | which are multiple tiles wide in the Y direction. | 
|  |  | 
|  | For each wire, we work out the "edges" (IE connection to other wires / pins). | 
|  |  | 
|  | Naming (ie track names) | 
|  | http://www.clifford.at/icestorm/logic_tile.html | 
|  | "Note: the Lattice tools use a different normalization scheme for this wire names." | 
|  | This doc: https://docs.google.com/document/d/1kTehDgse8GA2af5HoQ9Ntr41uNL_NJ43CjA32DofK8E/edit# | 
|  | I think is based on CW's naming but has some divergences | 
|  |  | 
|  | Some terminology clarification: | 
|  | -A VPR "track" is a specific net that can be connected to in the global fabric | 
|  |  | 
|  | -Icestorm docs primarily talk about "wires" which generally refer to a concept | 
|  | how how these nets are used per tile | 
|  |  | 
|  | That is, we take the Icestorm tile wire pattern and convert it to VPR tracks | 
|  |  | 
|  | Other resources: | 
|  | http://hedmen.org/icestorm-doc/icestorm.html | 
|  |  | 
|  |  | 
|  | mithro MVP proposal: spans and locals only | 
|  | Then add globals, then neighbourhood | 
|  | """ | 
|  |  | 
|  | import sys | 
|  | import os | 
|  |  | 
|  | from collections import namedtuple, OrderedDict | 
|  | import os | 
|  | import re | 
|  |  | 
|  | import lxml.etree as ET | 
|  |  | 
|  | from lib.collections_extra import CompassDir | 
|  | from lib.rr_graph import Position, single_element | 
|  |  | 
|  | import lib.rr_graph.channel as channel | 
|  | import lib.rr_graph.graph as graph | 
|  |  | 
|  | edges = [CompassDir.NN, CompassDir.EE, CompassDir.SS, CompassDir.WW] | 
|  |  | 
|  | _Track = namedtuple("Track", ("name", "type", "aliases")) | 
|  |  | 
|  |  | 
|  | class Track(_Track): | 
|  | def __str__(self): | 
|  | return self.name | 
|  |  | 
|  |  | 
|  | if True: | 
|  | # yapf: disable | 
|  | # pylint: disable=line-too-long,bad-whitespace | 
|  | #------------------------------ | 
|  | plb_tracks = [] | 
|  | plb_tracks.extend([ | 
|  | Track(name="glb2local[%s]" % i, type="glb2local", aliases=()) | 
|  | for i in [0, 1, 2, 3] | 
|  | ]) | 
|  | plb_tracks.extend([ | 
|  | # Span 4 Vertical | 
|  | Track(name="sp04_v[00]", type="span4", aliases=(               "sp4_v_b[1]",  )), | 
|  | Track(name="sp04_v[01]", type="span4", aliases=(               "sp4_v_b[0]",  )), | 
|  | Track(name="sp04_v[02]", type="span4", aliases=(               "sp4_v_b[3]",  )), | 
|  | Track(name="sp04_v[03]", type="span4", aliases=(               "sp4_v_b[2]",  )), | 
|  | Track(name="sp04_v[04]", type="span4", aliases=(               "sp4_v_b[5]",  )), | 
|  | Track(name="sp04_v[05]", type="span4", aliases=(               "sp4_v_b[4]",  )), | 
|  | Track(name="sp04_v[06]", type="span4", aliases=(               "sp4_v_b[7]",  )), | 
|  | Track(name="sp04_v[07]", type="span4", aliases=(               "sp4_v_b[6]",  )), | 
|  | Track(name="sp04_v[08]", type="span4", aliases=(               "sp4_v_b[9]",  )), | 
|  | Track(name="sp04_v[09]", type="span4", aliases=(               "sp4_v_b[8]",  )), | 
|  | Track(name="sp04_v[10]", type="span4", aliases=(               "sp4_v_b[11]", )), | 
|  | Track(name="sp04_v[11]", type="span4", aliases=(               "sp4_v_b[10]", )), | 
|  | Track(name="sp04_v[12]", type="span4", aliases=("sp4_v_t[0]",  "sp4_v_b[13]", )), | 
|  | Track(name="sp04_v[13]", type="span4", aliases=("sp4_v_t[1]",  "sp4_v_b[12]", )), | 
|  | Track(name="sp04_v[14]", type="span4", aliases=("sp4_v_t[2]",  "sp4_v_b[15]", )), | 
|  | Track(name="sp04_v[15]", type="span4", aliases=("sp4_v_t[3]",  "sp4_v_b[14]", )), | 
|  | Track(name="sp04_v[16]", type="span4", aliases=("sp4_v_t[4]",  "sp4_v_b[17]", )), | 
|  | Track(name="sp04_v[17]", type="span4", aliases=("sp4_v_t[5]",  "sp4_v_b[16]", )), | 
|  | Track(name="sp04_v[18]", type="span4", aliases=("sp4_v_t[6]",  "sp4_v_b[19]", )), | 
|  | Track(name="sp04_v[19]", type="span4", aliases=("sp4_v_t[7]",  "sp4_v_b[18]", )), | 
|  | Track(name="sp04_v[20]", type="span4", aliases=("sp4_v_t[8]",  "sp4_v_b[21]", )), | 
|  | Track(name="sp04_v[21]", type="span4", aliases=("sp4_v_t[9]",  "sp4_v_b[20]", )), | 
|  | Track(name="sp04_v[22]", type="span4", aliases=("sp4_v_t[10]", "sp4_v_b[23]", )), | 
|  | Track(name="sp04_v[23]", type="span4", aliases=("sp4_v_t[11]", "sp4_v_b[22]", )), | 
|  | Track(name="sp04_v[24]", type="span4", aliases=("sp4_v_t[12]", "sp4_v_b[25]", )), | 
|  | Track(name="sp04_v[25]", type="span4", aliases=("sp4_v_t[13]", "sp4_v_b[24]", )), | 
|  | Track(name="sp04_v[26]", type="span4", aliases=("sp4_v_t[14]", "sp4_v_b[27]", )), | 
|  | Track(name="sp04_v[27]", type="span4", aliases=("sp4_v_t[15]", "sp4_v_b[26]", )), | 
|  | Track(name="sp04_v[28]", type="span4", aliases=("sp4_v_t[16]", "sp4_v_b[29]", )), | 
|  | Track(name="sp04_v[29]", type="span4", aliases=("sp4_v_t[17]", "sp4_v_b[28]", )), | 
|  | Track(name="sp04_v[30]", type="span4", aliases=("sp4_v_t[18]", "sp4_v_b[31]", )), | 
|  | Track(name="sp04_v[31]", type="span4", aliases=("sp4_v_t[19]", "sp4_v_b[30]", )), | 
|  | Track(name="sp04_v[32]", type="span4", aliases=("sp4_v_t[20]", "sp4_v_b[33]", )), | 
|  | Track(name="sp04_v[33]", type="span4", aliases=("sp4_v_t[21]", "sp4_v_b[32]", )), | 
|  | Track(name="sp04_v[34]", type="span4", aliases=("sp4_v_t[22]", "sp4_v_b[35]", )), | 
|  | Track(name="sp04_v[35]", type="span4", aliases=("sp4_v_t[23]", "sp4_v_b[34]", )), | 
|  | Track(name="sp04_v[36]", type="span4", aliases=("sp4_v_t[24]", "sp4_v_b[37]", )), | 
|  | Track(name="sp04_v[37]", type="span4", aliases=("sp4_v_t[25]", "sp4_v_b[36]", )), | 
|  | Track(name="sp04_v[38]", type="span4", aliases=("sp4_v_t[26]", "sp4_v_b[39]", )), | 
|  | Track(name="sp04_v[39]", type="span4", aliases=("sp4_v_t[27]", "sp4_v_b[38]", )), | 
|  | Track(name="sp04_v[40]", type="span4", aliases=("sp4_v_t[28]", "sp4_v_b[41]", )), | 
|  | Track(name="sp04_v[41]", type="span4", aliases=("sp4_v_t[29]", "sp4_v_b[40]", )), | 
|  | Track(name="sp04_v[42]", type="span4", aliases=("sp4_v_t[30]", "sp4_v_b[43]", )), | 
|  | Track(name="sp04_v[43]", type="span4", aliases=("sp4_v_t[31]", "sp4_v_b[42]", )), | 
|  | Track(name="sp04_v[44]", type="span4", aliases=("sp4_v_t[32]", "sp4_v_b[45]", )), | 
|  | Track(name="sp04_v[45]", type="span4", aliases=("sp4_v_t[33]", "sp4_v_b[44]", )), | 
|  | Track(name="sp04_v[46]", type="span4", aliases=("sp4_v_t[34]", "sp4_v_b[47]", )), | 
|  | Track(name="sp04_v[47]", type="span4", aliases=("sp4_v_t[35]", "sp4_v_b[46]", )), | 
|  | Track(name="sp04_v[48]", type="span4", aliases=("sp4_v_t[36]",                )), | 
|  | Track(name="sp04_v[49]", type="span4", aliases=("sp4_v_t[37]",                )), | 
|  | Track(name="sp04_v[50]", type="span4", aliases=("sp4_v_t[38]",                )), | 
|  | Track(name="sp04_v[51]", type="span4", aliases=("sp4_v_t[39]",                )), | 
|  | Track(name="sp04_v[52]", type="span4", aliases=("sp4_v_t[40]",                )), | 
|  | Track(name="sp04_v[53]", type="span4", aliases=("sp4_v_t[41]",                )), | 
|  | Track(name="sp04_v[54]", type="span4", aliases=("sp4_v_t[42]",                )), | 
|  | Track(name="sp04_v[55]", type="span4", aliases=("sp4_v_t[43]",                )), | 
|  | Track(name="sp04_v[56]", type="span4", aliases=("sp4_v_t[44]",                )), | 
|  | Track(name="sp04_v[57]", type="span4", aliases=("sp4_v_t[45]",                )), | 
|  | Track(name="sp04_v[58]", type="span4", aliases=("sp4_v_t[46]",                )), | 
|  | Track(name="sp04_v[59]", type="span4", aliases=("sp4_v_t[47]",                )), | 
|  | # Span 4 Right Vertical | 
|  | Track(name="sp04_rv[00]", type="span4", aliases=("sp4_r_v_b[0]",  )), | 
|  | Track(name="sp04_rv[01]", type="span4", aliases=("sp4_r_v_b[1]",  )), | 
|  | Track(name="sp04_rv[02]", type="span4", aliases=("sp4_r_v_b[2]",  )), | 
|  | Track(name="sp04_rv[03]", type="span4", aliases=("sp4_r_v_b[3]",  )), | 
|  | Track(name="sp04_rv[04]", type="span4", aliases=("sp4_r_v_b[4]",  )), | 
|  | Track(name="sp04_rv[05]", type="span4", aliases=("sp4_r_v_b[5]",  )), | 
|  | Track(name="sp04_rv[06]", type="span4", aliases=("sp4_r_v_b[6]",  )), | 
|  | Track(name="sp04_rv[07]", type="span4", aliases=("sp4_r_v_b[7]",  )), | 
|  | Track(name="sp04_rv[08]", type="span4", aliases=("sp4_r_v_b[8]",  )), | 
|  | Track(name="sp04_rv[09]", type="span4", aliases=("sp4_r_v_b[9]",  )), | 
|  | Track(name="sp04_rv[10]", type="span4", aliases=("sp4_r_v_b[10]", )), | 
|  | Track(name="sp04_rv[11]", type="span4", aliases=("sp4_r_v_b[11]", )), | 
|  | Track(name="sp04_rv[12]", type="span4", aliases=("sp4_r_v_b[12]", )), | 
|  | Track(name="sp04_rv[13]", type="span4", aliases=("sp4_r_v_b[13]", )), | 
|  | Track(name="sp04_rv[14]", type="span4", aliases=("sp4_r_v_b[14]", )), | 
|  | Track(name="sp04_rv[15]", type="span4", aliases=("sp4_r_v_b[15]", )), | 
|  | Track(name="sp04_rv[16]", type="span4", aliases=("sp4_r_v_b[16]", )), | 
|  | Track(name="sp04_rv[17]", type="span4", aliases=("sp4_r_v_b[17]", )), | 
|  | Track(name="sp04_rv[18]", type="span4", aliases=("sp4_r_v_b[18]", )), | 
|  | Track(name="sp04_rv[19]", type="span4", aliases=("sp4_r_v_b[19]", )), | 
|  | Track(name="sp04_rv[20]", type="span4", aliases=("sp4_r_v_b[20]", )), | 
|  | Track(name="sp04_rv[21]", type="span4", aliases=("sp4_r_v_b[21]", )), | 
|  | Track(name="sp04_rv[22]", type="span4", aliases=("sp4_r_v_b[22]", )), | 
|  | Track(name="sp04_rv[23]", type="span4", aliases=("sp4_r_v_b[23]", )), | 
|  | Track(name="sp04_rv[24]", type="span4", aliases=("sp4_r_v_b[24]", )), | 
|  | Track(name="sp04_rv[25]", type="span4", aliases=("sp4_r_v_b[25]", )), | 
|  | Track(name="sp04_rv[26]", type="span4", aliases=("sp4_r_v_b[26]", )), | 
|  | Track(name="sp04_rv[27]", type="span4", aliases=("sp4_r_v_b[27]", )), | 
|  | Track(name="sp04_rv[28]", type="span4", aliases=("sp4_r_v_b[28]", )), | 
|  | Track(name="sp04_rv[29]", type="span4", aliases=("sp4_r_v_b[29]", )), | 
|  | Track(name="sp04_rv[30]", type="span4", aliases=("sp4_r_v_b[30]", )), | 
|  | Track(name="sp04_rv[31]", type="span4", aliases=("sp4_r_v_b[31]", )), | 
|  | Track(name="sp04_rv[32]", type="span4", aliases=("sp4_r_v_b[32]", )), | 
|  | Track(name="sp04_rv[33]", type="span4", aliases=("sp4_r_v_b[33]", )), | 
|  | Track(name="sp04_rv[34]", type="span4", aliases=("sp4_r_v_b[34]", )), | 
|  | Track(name="sp04_rv[35]", type="span4", aliases=("sp4_r_v_b[35]", )), | 
|  | Track(name="sp04_rv[36]", type="span4", aliases=("sp4_r_v_b[36]", )), | 
|  | Track(name="sp04_rv[37]", type="span4", aliases=("sp4_r_v_b[37]", )), | 
|  | Track(name="sp04_rv[38]", type="span4", aliases=("sp4_r_v_b[38]", )), | 
|  | Track(name="sp04_rv[39]", type="span4", aliases=("sp4_r_v_b[39]", )), | 
|  | Track(name="sp04_rv[40]", type="span4", aliases=("sp4_r_v_b[40]", )), | 
|  | Track(name="sp04_rv[41]", type="span4", aliases=("sp4_r_v_b[41]", )), | 
|  | Track(name="sp04_rv[42]", type="span4", aliases=("sp4_r_v_b[42]", )), | 
|  | Track(name="sp04_rv[43]", type="span4", aliases=("sp4_r_v_b[43]", )), | 
|  | Track(name="sp04_rv[44]", type="span4", aliases=("sp4_r_v_b[44]", )), | 
|  | Track(name="sp04_rv[45]", type="span4", aliases=("sp4_r_v_b[45]", )), | 
|  | Track(name="sp04_rv[46]", type="span4", aliases=("sp4_r_v_b[46]", )), | 
|  | Track(name="sp04_rv[47]", type="span4", aliases=("sp4_r_v_b[47]", )), | 
|  | # Span 12 Vertical | 
|  | Track(name="sp12_v[00]", type="span12", aliases=(                "sp12_v_b[1]",  )), | 
|  | Track(name="sp12_v[01]", type="span12", aliases=(                "sp12_v_b[0]",  )), | 
|  | Track(name="sp12_v[02]", type="span12", aliases=("sp12_v_t[0]",  "sp12_v_b[3]",  )), | 
|  | Track(name="sp12_v[03]", type="span12", aliases=("sp12_v_t[1]",  "sp12_v_b[2]",  )), | 
|  | Track(name="sp12_v[04]", type="span12", aliases=("sp12_v_t[2]",  "sp12_v_b[5]",  )), | 
|  | Track(name="sp12_v[05]", type="span12", aliases=("sp12_v_t[3]",  "sp12_v_b[4]",  )), | 
|  | Track(name="sp12_v[06]", type="span12", aliases=("sp12_v_t[4]",  "sp12_v_b[7]",  )), | 
|  | Track(name="sp12_v[07]", type="span12", aliases=("sp12_v_t[5]",  "sp12_v_b[6]",  )), | 
|  | Track(name="sp12_v[08]", type="span12", aliases=("sp12_v_t[6]",  "sp12_v_b[9]",  )), | 
|  | Track(name="sp12_v[09]", type="span12", aliases=("sp12_v_t[7]",  "sp12_v_b[8]",  )), | 
|  | Track(name="sp12_v[10]", type="span12", aliases=("sp12_v_t[8]",  "sp12_v_b[11]", )), | 
|  | Track(name="sp12_v[11]", type="span12", aliases=("sp12_v_t[9]",  "sp12_v_b[10]", )), | 
|  | Track(name="sp12_v[12]", type="span12", aliases=("sp12_v_t[10]", "sp12_v_b[13]", )), | 
|  | Track(name="sp12_v[13]", type="span12", aliases=("sp12_v_t[11]", "sp12_v_b[12]", )), | 
|  | Track(name="sp12_v[14]", type="span12", aliases=("sp12_v_t[12]", "sp12_v_b[15]", )), | 
|  | Track(name="sp12_v[15]", type="span12", aliases=("sp12_v_t[13]", "sp12_v_b[14]", )), | 
|  | Track(name="sp12_v[16]", type="span12", aliases=("sp12_v_t[14]", "sp12_v_b[17]", )), | 
|  | Track(name="sp12_v[17]", type="span12", aliases=("sp12_v_t[15]", "sp12_v_b[16]", )), | 
|  | Track(name="sp12_v[18]", type="span12", aliases=("sp12_v_t[16]", "sp12_v_b[19]", )), | 
|  | Track(name="sp12_v[19]", type="span12", aliases=("sp12_v_t[17]", "sp12_v_b[18]", )), | 
|  | Track(name="sp12_v[20]", type="span12", aliases=("sp12_v_t[18]", "sp12_v_b[21]", )), | 
|  | Track(name="sp12_v[21]", type="span12", aliases=("sp12_v_t[19]", "sp12_v_b[20]", )), | 
|  | Track(name="sp12_v[22]", type="span12", aliases=("sp12_v_t[20]", "sp12_v_b[23]", )), | 
|  | Track(name="sp12_v[23]", type="span12", aliases=("sp12_v_t[21]", "sp12_v_b[22]", )), | 
|  | Track(name="sp12_v[24]", type="span12", aliases=("sp12_v_t[22]",                 )), | 
|  | Track(name="sp12_v[25]", type="span12", aliases=("sp12_v_t[23]",                 )), | 
|  | # Span 4 Horizontal | 
|  | Track(name="sp04_h[00]", type="span4", aliases=(               "sp4_h_r[1]",  )), | 
|  | Track(name="sp04_h[01]", type="span4", aliases=(               "sp4_h_r[0]",  )), | 
|  | Track(name="sp04_h[02]", type="span4", aliases=(               "sp4_h_r[3]",  )), | 
|  | Track(name="sp04_h[03]", type="span4", aliases=(               "sp4_h_r[2]",  )), | 
|  | Track(name="sp04_h[04]", type="span4", aliases=(               "sp4_h_r[5]",  )), | 
|  | Track(name="sp04_h[05]", type="span4", aliases=(               "sp4_h_r[4]",  )), | 
|  | Track(name="sp04_h[06]", type="span4", aliases=(               "sp4_h_r[7]",  )), | 
|  | Track(name="sp04_h[07]", type="span4", aliases=(               "sp4_h_r[6]",  )), | 
|  | Track(name="sp04_h[08]", type="span4", aliases=(               "sp4_h_r[9]",  )), | 
|  | Track(name="sp04_h[09]", type="span4", aliases=(               "sp4_h_r[8]",  )), | 
|  | Track(name="sp04_h[10]", type="span4", aliases=(               "sp4_h_r[11]", )), | 
|  | Track(name="sp04_h[11]", type="span4", aliases=(               "sp4_h_r[10]", )), | 
|  | Track(name="sp04_h[12]", type="span4", aliases=("sp4_h_l[0]",  "sp4_h_r[13]", )), | 
|  | Track(name="sp04_h[13]", type="span4", aliases=("sp4_h_l[1]",  "sp4_h_r[12]", )), | 
|  | Track(name="sp04_h[14]", type="span4", aliases=("sp4_h_l[2]",  "sp4_h_r[15]", )), | 
|  | Track(name="sp04_h[15]", type="span4", aliases=("sp4_h_l[3]",  "sp4_h_r[14]", )), | 
|  | Track(name="sp04_h[16]", type="span4", aliases=("sp4_h_l[4]",  "sp4_h_r[17]", )), | 
|  | Track(name="sp04_h[17]", type="span4", aliases=("sp4_h_l[5]",  "sp4_h_r[16]", )), | 
|  | Track(name="sp04_h[18]", type="span4", aliases=("sp4_h_l[6]",  "sp4_h_r[19]", )), | 
|  | Track(name="sp04_h[19]", type="span4", aliases=("sp4_h_l[7]",  "sp4_h_r[18]", )), | 
|  | Track(name="sp04_h[20]", type="span4", aliases=("sp4_h_l[8]",  "sp4_h_r[21]", )), | 
|  | Track(name="sp04_h[21]", type="span4", aliases=("sp4_h_l[9]",  "sp4_h_r[20]", )), | 
|  | Track(name="sp04_h[22]", type="span4", aliases=("sp4_h_l[10]", "sp4_h_r[23]", )), | 
|  | Track(name="sp04_h[23]", type="span4", aliases=("sp4_h_l[11]", "sp4_h_r[22]", )), | 
|  | Track(name="sp04_h[24]", type="span4", aliases=("sp4_h_l[12]", "sp4_h_r[25]", )), | 
|  | Track(name="sp04_h[25]", type="span4", aliases=("sp4_h_l[13]", "sp4_h_r[24]", )), | 
|  | Track(name="sp04_h[26]", type="span4", aliases=("sp4_h_l[14]", "sp4_h_r[27]", )), | 
|  | Track(name="sp04_h[27]", type="span4", aliases=("sp4_h_l[15]", "sp4_h_r[26]", )), | 
|  | Track(name="sp04_h[28]", type="span4", aliases=("sp4_h_l[16]", "sp4_h_r[29]", )), | 
|  | Track(name="sp04_h[29]", type="span4", aliases=("sp4_h_l[17]", "sp4_h_r[28]", )), | 
|  | Track(name="sp04_h[30]", type="span4", aliases=("sp4_h_l[18]", "sp4_h_r[31]", )), | 
|  | Track(name="sp04_h[31]", type="span4", aliases=("sp4_h_l[19]", "sp4_h_r[30]", )), | 
|  | Track(name="sp04_h[32]", type="span4", aliases=("sp4_h_l[20]", "sp4_h_r[33]", )), | 
|  | Track(name="sp04_h[33]", type="span4", aliases=("sp4_h_l[21]", "sp4_h_r[32]", )), | 
|  | Track(name="sp04_h[34]", type="span4", aliases=("sp4_h_l[22]", "sp4_h_r[35]", )), | 
|  | Track(name="sp04_h[35]", type="span4", aliases=("sp4_h_l[23]", "sp4_h_r[34]", )), | 
|  | Track(name="sp04_h[36]", type="span4", aliases=("sp4_h_l[24]", "sp4_h_r[37]", )), | 
|  | Track(name="sp04_h[37]", type="span4", aliases=("sp4_h_l[25]", "sp4_h_r[36]", )), | 
|  | Track(name="sp04_h[38]", type="span4", aliases=("sp4_h_l[26]", "sp4_h_r[39]", )), | 
|  | Track(name="sp04_h[39]", type="span4", aliases=("sp4_h_l[27]", "sp4_h_r[38]", )), | 
|  | Track(name="sp04_h[40]", type="span4", aliases=("sp4_h_l[28]", "sp4_h_r[41]", )), | 
|  | Track(name="sp04_h[41]", type="span4", aliases=("sp4_h_l[29]", "sp4_h_r[40]", )), | 
|  | Track(name="sp04_h[42]", type="span4", aliases=("sp4_h_l[30]", "sp4_h_r[43]", )), | 
|  | Track(name="sp04_h[43]", type="span4", aliases=("sp4_h_l[31]", "sp4_h_r[42]", )), | 
|  | Track(name="sp04_h[44]", type="span4", aliases=("sp4_h_l[32]", "sp4_h_r[45]", )), | 
|  | Track(name="sp04_h[45]", type="span4", aliases=("sp4_h_l[33]", "sp4_h_r[44]", )), | 
|  | Track(name="sp04_h[46]", type="span4", aliases=("sp4_h_l[34]", "sp4_h_r[47]", )), | 
|  | Track(name="sp04_h[47]", type="span4", aliases=("sp4_h_l[35]", "sp4_h_r[46]", )), | 
|  | Track(name="sp04_h[48]", type="span4", aliases=("sp4_h_l[36]",                )), | 
|  | Track(name="sp04_h[49]", type="span4", aliases=("sp4_h_l[37]",                )), | 
|  | Track(name="sp04_h[50]", type="span4", aliases=("sp4_h_l[38]",                )), | 
|  | Track(name="sp04_h[51]", type="span4", aliases=("sp4_h_l[39]",                )), | 
|  | Track(name="sp04_h[52]", type="span4", aliases=("sp4_h_l[40]",                )), | 
|  | Track(name="sp04_h[53]", type="span4", aliases=("sp4_h_l[41]",                )), | 
|  | Track(name="sp04_h[54]", type="span4", aliases=("sp4_h_l[42]",                )), | 
|  | Track(name="sp04_h[55]", type="span4", aliases=("sp4_h_l[43]",                )), | 
|  | Track(name="sp04_h[56]", type="span4", aliases=("sp4_h_l[44]",                )), | 
|  | Track(name="sp04_h[57]", type="span4", aliases=("sp4_h_l[45]",                )), | 
|  | Track(name="sp04_h[58]", type="span4", aliases=("sp4_h_l[46]",                )), | 
|  | Track(name="sp04_h[59]", type="span4", aliases=("sp4_h_l[47]",                )), | 
|  | # Span 12 Horizontal | 
|  | Track(name="sp12_h[00]", type="span12", aliases=(                "sp12_h_r[1]",  )), | 
|  | Track(name="sp12_h[01]", type="span12", aliases=(                "sp12_h_r[0]",  )), | 
|  | Track(name="sp12_h[02]", type="span12", aliases=("sp12_h_l[0]",  "sp12_h_r[3]",  )), | 
|  | Track(name="sp12_h[03]", type="span12", aliases=("sp12_h_l[1]",  "sp12_h_r[2]",  )), | 
|  | Track(name="sp12_h[04]", type="span12", aliases=("sp12_h_l[2]",  "sp12_h_r[5]",  )), | 
|  | Track(name="sp12_h[05]", type="span12", aliases=("sp12_h_l[3]",  "sp12_h_r[4]",  )), | 
|  | Track(name="sp12_h[06]", type="span12", aliases=("sp12_h_l[4]",  "sp12_h_r[7]",  )), | 
|  | Track(name="sp12_h[07]", type="span12", aliases=("sp12_h_l[5]",  "sp12_h_r[6]",  )), | 
|  | Track(name="sp12_h[08]", type="span12", aliases=("sp12_h_l[6]",  "sp12_h_r[9]",  )), | 
|  | Track(name="sp12_h[09]", type="span12", aliases=("sp12_h_l[7]",  "sp12_h_r[8]",  )), | 
|  | Track(name="sp12_h[10]", type="span12", aliases=("sp12_h_l[8]",  "sp12_h_r[11]", )), | 
|  | Track(name="sp12_h[11]", type="span12", aliases=("sp12_h_l[9]",  "sp12_h_r[10]", )), | 
|  | Track(name="sp12_h[12]", type="span12", aliases=("sp12_h_l[10]", "sp12_h_r[13]", )), | 
|  | Track(name="sp12_h[13]", type="span12", aliases=("sp12_h_l[11]", "sp12_h_r[12]", )), | 
|  | Track(name="sp12_h[14]", type="span12", aliases=("sp12_h_l[12]", "sp12_h_r[15]", )), | 
|  | Track(name="sp12_h[15]", type="span12", aliases=("sp12_h_l[13]", "sp12_h_r[14]", )), | 
|  | Track(name="sp12_h[16]", type="span12", aliases=("sp12_h_l[14]", "sp12_h_r[17]", )), | 
|  | Track(name="sp12_h[17]", type="span12", aliases=("sp12_h_l[15]", "sp12_h_r[16]", )), | 
|  | Track(name="sp12_h[18]", type="span12", aliases=("sp12_h_l[16]", "sp12_h_r[19]", )), | 
|  | Track(name="sp12_h[19]", type="span12", aliases=("sp12_h_l[17]", "sp12_h_r[18]", )), | 
|  | Track(name="sp12_h[20]", type="span12", aliases=("sp12_h_l[18]", "sp12_h_r[21]", )), | 
|  | Track(name="sp12_h[21]", type="span12", aliases=("sp12_h_l[19]", "sp12_h_r[20]", )), | 
|  | Track(name="sp12_h[22]", type="span12", aliases=("sp12_h_l[20]", "sp12_h_r[23]", )), | 
|  | Track(name="sp12_h[23]", type="span12", aliases=("sp12_h_l[21]", "sp12_h_r[22]", )), | 
|  | Track(name="sp12_h[24]", type="span12", aliases=("sp12_h_l[22]",                 )), | 
|  | Track(name="sp12_h[25]", type="span12", aliases=("sp12_h_l[23]",                 )), | 
|  | ]) | 
|  | #------------------------------ | 
|  | # yapf: enable | 
|  |  | 
|  | if True: | 
|  | # yapf: disable | 
|  | # pylint: disable=line-too-long,bad-whitespace | 
|  | #------------------------------ | 
|  |  | 
|  | #span4_vert_b_{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} | 
|  | #span4_vert_t_{12,13,14,15} | 
|  | io_tracks = [ | 
|  | Track(name="fabout", type="local", aliases=("fabout[0]", )), | 
|  | Track(name="sp4_h[00]", type="span4", aliases=(                    "span4_horz_r[0]",  )), | 
|  | Track(name="sp4_h[01]", type="span4", aliases=(                    "span4_horz_r[1]",  )), | 
|  | Track(name="sp4_h[02]", type="span4", aliases=(                    "span4_horz_r[2]",  )), | 
|  | Track(name="sp4_h[03]", type="span4", aliases=(                    "span4_horz_r[3]",  )), | 
|  | Track(name="sp4_h[04]", type="span4", aliases=("span4_horz_l[0]",  "span4_horz_r[4]",  )), | 
|  | Track(name="sp4_h[05]", type="span4", aliases=("span4_horz_l[1]",  "span4_horz_r[5]",  )), | 
|  | Track(name="sp4_h[06]", type="span4", aliases=("span4_horz_l[2]",  "span4_horz_r[6]",  )), | 
|  | Track(name="sp4_h[07]", type="span4", aliases=("span4_horz_l[3]",  "span4_horz_r[7]",  )), | 
|  | Track(name="sp4_h[08]", type="span4", aliases=("span4_horz_l[4]",  "span4_horz_r[8]",  )), | 
|  | Track(name="sp4_h[09]", type="span4", aliases=("span4_horz_l[5]",  "span4_horz_r[9]",  )), | 
|  | Track(name="sp4_h[10]", type="span4", aliases=("span4_horz_l[6]",  "span4_horz_r[10]", )), | 
|  | Track(name="sp4_h[11]", type="span4", aliases=("span4_horz_l[7]",  "span4_horz_r[11]", )), | 
|  | Track(name="sp4_h[12]", type="span4", aliases=("span4_horz_l[8]",  "span4_horz_r[12]", )), | 
|  | Track(name="sp4_h[13]", type="span4", aliases=("span4_horz_l[9]",  "span4_horz_r[13]", )), | 
|  | Track(name="sp4_h[14]", type="span4", aliases=("span4_horz_l[10]", "span4_horz_r[14]", )), | 
|  | Track(name="sp4_h[15]", type="span4", aliases=("span4_horz_l[11]", "span4_horz_r[15]", )), | 
|  | Track(name="sp4_h[16]", type="span4", aliases=("span4_horz_l[12]",                     )), | 
|  | Track(name="sp4_h[17]", type="span4", aliases=("span4_horz_l[13]",                     )), | 
|  | Track(name="sp4_h[18]", type="span4", aliases=("span4_horz_l[14]",                     )), | 
|  | Track(name="sp4_h[19]", type="span4", aliases=("span4_horz_l[15]",                     )), | 
|  | Track(name="sp4_v[00]", type="span4", aliases=(                    "span4_vert_t[0]",  )), | 
|  | Track(name="sp4_v[01]", type="span4", aliases=(                    "span4_vert_t[1]",  )), | 
|  | Track(name="sp4_v[02]", type="span4", aliases=(                    "span4_vert_t[2]",  )), | 
|  | Track(name="sp4_v[03]", type="span4", aliases=(                    "span4_vert_t[3]",  )), | 
|  | Track(name="sp4_v[04]", type="span4", aliases=("span4_vert_b[0]",  "span4_vert_t[4]",  )), | 
|  | Track(name="sp4_v[05]", type="span4", aliases=("span4_vert_b[1]",  "span4_vert_t[5]",  )), | 
|  | Track(name="sp4_v[06]", type="span4", aliases=("span4_vert_b[2]",  "span4_vert_t[6]",  )), | 
|  | Track(name="sp4_v[07]", type="span4", aliases=("span4_vert_b[3]",  "span4_vert_t[7]",  )), | 
|  | Track(name="sp4_v[08]", type="span4", aliases=("span4_vert_b[4]",  "span4_vert_t[8]",  )), | 
|  | Track(name="sp4_v[09]", type="span4", aliases=("span4_vert_b[5]",  "span4_vert_t[9]",  )), | 
|  | Track(name="sp4_v[10]", type="span4", aliases=("span4_vert_b[6]",  "span4_vert_t[10]", )), | 
|  | Track(name="sp4_v[11]", type="span4", aliases=("span4_vert_b[7]",  "span4_vert_t[11]", )), | 
|  | Track(name="sp4_v[12]", type="span4", aliases=("span4_vert_b[8]",  "span4_vert_t[12]", )), | 
|  | Track(name="sp4_v[13]", type="span4", aliases=("span4_vert_b[9]",  "span4_vert_t[13]", )), | 
|  | Track(name="sp4_v[14]", type="span4", aliases=("span4_vert_b[10]", "span4_vert_t[14]", )), | 
|  | Track(name="sp4_v[15]", type="span4", aliases=("span4_vert_b[11]", "span4_vert_t[15]", )), | 
|  | Track(name="sp4_v[16]", type="span4", aliases=("span4_vert_b[12]",                     )), | 
|  | Track(name="sp4_v[17]", type="span4", aliases=("span4_vert_b[13]",                     )), | 
|  | Track(name="sp4_v[18]", type="span4", aliases=("span4_vert_b[14]",                     )), | 
|  | Track(name="sp4_v[19]", type="span4", aliases=("span4_vert_b[15]",                     )), | 
|  | ] | 
|  |  | 
|  | #span4_horz_{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47} | 
|  | for i in range(0, 48): | 
|  | io_tracks.extend([ | 
|  | Track(name="sp4_v_term[%02i]" % i, type="span4", aliases=("span4_vert[%s]" % i, "sp4_v_t[%s]" % i, "sp4_v_b[%s]" % i)), | 
|  | Track(name="sp4_h_term[%02i]" % i, type="span4", aliases=("span4_horz[%s]" % i, "sp4_h_l[%s]" % i, "sp4_h_r[%s]" % i)), | 
|  | ]) | 
|  |  | 
|  | #span12_horz_{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23} | 
|  | for i in range(0, 24): | 
|  | io_tracks.extend([ | 
|  | Track(name="sp12_v_term[%02i]" % i, type="span12", aliases=("span12_vert[%s]" % i, "sp12_v_t[%s]" % i, "sp12_v_b[%s]" % i)), | 
|  | Track(name="sp12_h_term[%02i]" % i, type="span12", aliases=("span12_horz[%s]" % i, "sp12_h_l[%s]" % i, "sp12_h_r[%s]" % i)), | 
|  | ]) | 
|  |  | 
|  | #------------------------------ | 
|  | # yapf: enable | 
|  |  | 
|  | local_names = [ | 
|  | "local_g%s[%s]" % (grp, idx) for grp in range(0, 4) for idx in range(0, 8) | 
|  | ] | 
|  | global_names = ["glb_netwk[%s]" % i for i in [0, 1, 2, 3, 4, 5, 6, 7]] | 
|  |  | 
|  | mappings = [] | 
|  | for edge_src, edge_dst, delta in [ | 
|  | ("v_t", "v_b", CompassDir.N), | 
|  | ("h_l", "h_r", CompassDir.E), | 
|  | ("v_b", "r_v_b", CompassDir.W), | 
|  | ]: | 
|  | # Span 4s | 
|  | for i in range(0, 48): | 
|  | src_net = "sp4_%s[%s]" % (edge_src, i) | 
|  | dst_net = "sp4_%s[%s]" % (edge_dst, i) | 
|  | mappings.append((src_net, delta, dst_net)) | 
|  |  | 
|  | if edge_src.startswith("r_"): | 
|  | continue | 
|  |  | 
|  | # Span 12s | 
|  | for i in range(0, 24): | 
|  | src_net = "sp12_%s[%s]" % (edge_src, i) | 
|  | dst_net = "sp12_%s[%s]" % (edge_dst, i) | 
|  | mappings.append((src_net, delta, dst_net)) | 
|  |  | 
|  | for edge_src, edge_dst, delta in [ | 
|  | ("t", "b", CompassDir.N), | 
|  | ("l", "r", CompassDir.E), | 
|  | # Connection around the corners.. | 
|  | #("t", "r", CompassDir.NW), | 
|  | #("t", "l", CompassDir.NE), | 
|  | #("l", "b", CompassDir.NW), | 
|  | #("l", "r", CompassDir.NE), | 
|  | ]: | 
|  |  | 
|  | # IO Span 4s | 
|  | for i in range(0, 20): | 
|  | src_net = "sp4_io_%s[%s]" % (edge_src, i) | 
|  | dst_net = "sp4_io_%s[%s]" % (edge_dst, i) | 
|  | mappings.append((src_net, delta, dst_net)) | 
|  |  | 
|  | mappings.append(("FCOUT[0]", CompassDir.N, "FCIN[0]")) | 
|  |  | 
|  |  | 
|  | def segment_type(g, d): | 
|  | if d.type == 'span4': | 
|  | s_type = g.segments["span4"] | 
|  | elif d.type == 'span12': | 
|  | s_type = g.segments["span12"] | 
|  | elif d.type == 'glb2local': | 
|  | s_type = g.segments["glb2local"] | 
|  | elif d.type == 'global': | 
|  | s_type = g.segments["local"] | 
|  | elif d.type == 'local': | 
|  | s_type = g.segments["local"] | 
|  | else: | 
|  | assert False, "segment_type " + d.name | 
|  |  | 
|  | if d.type in ("local", "global", "glb2local"): | 
|  | d_type = channel.Track.Type.Y | 
|  | elif '_h' in d.name: | 
|  | d_type = channel.Track.Type.X | 
|  | elif '_v' in d.name or '_rv' in d.name: | 
|  | d_type = channel.Track.Type.Y | 
|  | else: | 
|  | #d_type = channel.Track.Type.X | 
|  | assert False, "dir " + d.name | 
|  |  | 
|  | return s_type, d_type | 
|  |  | 
|  |  | 
|  | def edges_for(d): | 
|  | bits = [ | 
|  | ('_v_t_', (CompassDir.N, )), | 
|  | ('_v_b_', (CompassDir.S, )), | 
|  | ('_h_l_', (CompassDir.W, )), | 
|  | ('_h_r_', (CompassDir.E, )), | 
|  | ('_horz_', (CompassDir.W, CompassDir.E)), | 
|  | ('_vert_', (CompassDir.N, CompassDir.S)), | 
|  | ] | 
|  | for b, r in bits: | 
|  | if b in d.name: | 
|  | return d.name.replace(b, ''), r | 
|  |  | 
|  |  | 
|  | def side_for(block, pin): | 
|  | if pin.port_name == "FCOUT": | 
|  | return graph.RoutingNodeSide.TOP | 
|  | elif pin.port_name == "FCIN": | 
|  | return graph.RoutingNodeSide.BOTTOM | 
|  | return graph.RoutingNodeSide.RIGHT | 
|  |  | 
|  |  | 
|  | def fix_name(n): | 
|  | n = re.sub("_([0-9]+)$", "[\\1]", n) | 
|  | if not n.endswith(']'): | 
|  | n = n + "[0]" | 
|  | n = n.replace("/", "_") | 
|  | return n | 
|  |  | 
|  |  | 
|  | def icepos(pos): | 
|  | return pos.x - 1, pos.y - 1 | 
|  |  | 
|  |  | 
|  | def create_tracks(g, verbose=False): | 
|  | print("Block grid size: %s" % (g.block_grid.size, )) | 
|  | print("Channel grid size: %s" % (g.channels.size, )) | 
|  |  | 
|  | import icebox | 
|  | ic = icebox.iceconfig() | 
|  | ic.setup_empty_384() | 
|  |  | 
|  | #seg_timing = {'R_per_meter':420, 'C_per_meter':3.e-14} | 
|  | #segment = g.channels.create_segment('awesomesauce', timing=seg_timing) | 
|  |  | 
|  | type_y = channel.Track.Type.Y | 
|  | type_x = channel.Track.Type.X | 
|  | bi_dir = channel.Track.Direction.BI | 
|  |  | 
|  | short_xml = list( | 
|  | g._xml_graph.iterfind('//switches/switch/[@name="short"]') | 
|  | )[0] | 
|  | #short_xml.attrib['configurable'] = '0' | 
|  | #short_xml.attrib['buffered'] = '0' | 
|  | print("Rewrote short switch: ", ET.tostring(short_xml)) | 
|  |  | 
|  | ############################################################################# | 
|  | # Internal Block wires | 
|  | ############################################################################# | 
|  | segment_global = g.segments["global"] | 
|  | segment_local = g.segments["local"] | 
|  |  | 
|  | for block in g.block_grid: | 
|  | tname = block.block_type.name | 
|  |  | 
|  | if tname == "EMPTY": | 
|  | continue | 
|  |  | 
|  | print("=" * 75) | 
|  | begin, end = block.position, block.position | 
|  |  | 
|  | # Locals | 
|  | for l_n in local_names: | 
|  | track, _track_node = g.create_xy_track( | 
|  | begin, end, segment_local, typeh=type_y, direction=bi_dir | 
|  | ) | 
|  |  | 
|  | print("{} - {}".format(block, l_n)) | 
|  |  | 
|  | g.routing.localnames.add(begin, l_n, _track_node) | 
|  |  | 
|  | for g_n in global_names: | 
|  | track, _track_node = g.create_xy_track( | 
|  | begin, end, segment_global, typeh=type_y, direction=bi_dir | 
|  | ) | 
|  |  | 
|  | print("{} - {}".format(block, g_n)) | 
|  |  | 
|  | g.routing.localnames.add(begin, g_n, _track_node) | 
|  |  | 
|  | if tname == "PLB": | 
|  | tracks = plb_tracks | 
|  | elif tname.startswith("PIO"): | 
|  | tracks = io_tracks | 
|  |  | 
|  | for d in tracks: | 
|  | s_type, d_type = segment_type(g, d) | 
|  | track, _track_node = g.create_xy_track( | 
|  | begin, end, s_type, typeh=d_type, direction=bi_dir | 
|  | ) | 
|  |  | 
|  | print("%s - Created track %s (%s)" % (block, d.aliases, track)) | 
|  |  | 
|  | g.routing.localnames.add(begin, d.name, _track_node) | 
|  | for alias in d.aliases: | 
|  | g.routing.localnames.add(begin, alias, _track_node) | 
|  |  | 
|  | ############################################################################# | 
|  | # Internal Block connections | 
|  | ############################################################################# | 
|  |  | 
|  | for src_block in g.block_grid: | 
|  | try: | 
|  | src_names = g.routing.localnames[src_block.position] | 
|  | except KeyError as e: | 
|  | print(src_block, e) | 
|  | continue | 
|  |  | 
|  | print("=" * 75) | 
|  |  | 
|  | pos = icepos(src_block.position) | 
|  | for entry in ic.tile_db(*pos): | 
|  | if not ic.tile_has_entry(*pos, entry): | 
|  | #print("{} - Skipping (tile_has_entry) {}".format(src_block, entry[1:])) | 
|  | continue | 
|  | if entry[1] not in ('buffer', 'routing'): | 
|  | #print("{} - Skipping (not buffer/routing) {}".format(src_block, entry[1:])) | 
|  | continue | 
|  |  | 
|  | switch_type, src_name, dst_name = entry[1:] | 
|  | src_name = fix_name(src_name) | 
|  | dst_name = fix_name(dst_name) | 
|  |  | 
|  | if src_name not in src_names: | 
|  | print( | 
|  | "{} - Skipping (src not exist) **{}** -> {}".format( | 
|  | src_block, src_name, dst_name | 
|  | ) | 
|  | ) | 
|  | continue | 
|  | if dst_name not in src_names: | 
|  | print( | 
|  | "{} - Skipping (dst not exist) {} -> **{}**".format( | 
|  | src_block, src_name, dst_name | 
|  | ) | 
|  | ) | 
|  | continue | 
|  |  | 
|  | src_node = g.routing.localnames[(src_block.position, src_name)] | 
|  | dst_node = g.routing.localnames[(src_block.position, dst_name)] | 
|  | g.routing.create_edge_with_nodes( | 
|  | src_node, dst_node, g.switches[switch_type] | 
|  | ) | 
|  |  | 
|  | xml_id = graph.RoutingGraph._get_xml_id | 
|  |  | 
|  | if entry[1] == 'routing': | 
|  | g.routing.create_edge_with_nodes( | 
|  | dst_node, src_node, g.switches[switch_type] | 
|  | ) | 
|  |  | 
|  | dir_str = { | 
|  | 'buffer': "->", | 
|  | 'routing': "<->", | 
|  | }[entry[1]] | 
|  |  | 
|  | print( | 
|  | src_block, | 
|  | src_name, | 
|  | xml_id(src_node), | 
|  | dir_str, | 
|  | dst_name, | 
|  | xml_id(dst_node), | 
|  | ) | 
|  |  | 
|  | ############################################################################# | 
|  | # Block -> Block connections | 
|  | ############################################################################# | 
|  |  | 
|  | for src_block in g.block_grid: | 
|  | try: | 
|  | src_names = g.routing.localnames[src_block.position] | 
|  | except KeyError as e: | 
|  | print(src_block, e) | 
|  | continue | 
|  |  | 
|  | for src_name, delta, dst_name in mappings: | 
|  | try: | 
|  | src_node = g.routing.localnames[(src_block.position, src_name)] | 
|  | except KeyError as e: | 
|  | print(src_name, "not found on", src_block, e) | 
|  | continue | 
|  |  | 
|  | dst_pos = src_block.position + delta | 
|  | try: | 
|  | dst_node = g.routing.localnames[(dst_pos, dst_name)] | 
|  | except KeyError as e: | 
|  | print( | 
|  | dst_name, "not found on block", delta, "(which is", | 
|  | dst_pos, ")", e | 
|  | ) | 
|  | continue | 
|  |  | 
|  | dst_block = g.block_grid[dst_pos] | 
|  |  | 
|  | print( | 
|  | "Found {}->{} on {} {} ({})".format( | 
|  | src_name, dst_name, src_block, delta, dst_block | 
|  | ) | 
|  | ) | 
|  | g.routing.create_edge_with_nodes( | 
|  | src_node, dst_node, g.switches["short"] | 
|  | ) | 
|  | #g.routing.create_edge_with_nodes(dst_node, src_node, | 
|  | #                                 g.switches["short"]) | 
|  |  | 
|  | ############################################################################# | 
|  |  | 
|  |  | 
|  | def patch_rr_graph(filename_in, filename_out, verbose=False): | 
|  | print('Importing input g') | 
|  | g = graph.Graph( | 
|  | rr_graph_file=filename_in, | 
|  | verbose=verbose, | 
|  | clear_fabric=True, | 
|  | sides=side_for | 
|  | ) | 
|  | print('Source g loaded') | 
|  | print("Grid size: %s" % (g.block_grid.size, )) | 
|  | print() | 
|  |  | 
|  | create_tracks(g, verbose=verbose) | 
|  | print() | 
|  | print("Completed rebuild") | 
|  |  | 
|  | if filename_out: | 
|  | print('Writing to %s' % filename_out) | 
|  | open(filename_out, 'w').write( | 
|  | ET.tostring(g.to_xml(), pretty_print=True).decode('ascii') | 
|  | ) | 
|  | else: | 
|  | print("Printing") | 
|  | print(ET.tostring(g.to_xml(), pretty_print=True).decode('ascii')) | 
|  |  | 
|  | return g | 
|  |  | 
|  |  | 
|  | def main(): | 
|  |  | 
|  | import argparse | 
|  |  | 
|  | parser = argparse.ArgumentParser() | 
|  | parser.add_argument("--verbose", action='store_true') | 
|  | parser.add_argument("--read_rr_graph") | 
|  | parser.add_argument("--write_rr_graph", nargs='?') | 
|  | args = parser.parse_args() | 
|  |  | 
|  | patch_rr_graph( | 
|  | args.read_rr_graph, args.write_rr_graph, verbose=args.verbose | 
|  | ) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main() |