blob: de8ddf2db7993618cd36293f6440e7afdfeaab9d [file] [log] [blame] [edit]
#!/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()