blob: 5bc7fd7cabd460a166d80e037a08da5e9b2d4db0 [file] [log] [blame] [edit]
"""
This file contains definitions of various data structutes used to hold tilegrid
and routing information of a Quicklogic FPGA.
"""
from collections import namedtuple
from enum import Enum
# =============================================================================
"""
Pin direction in terms of its function.
"""
class PinDirection(Enum):
UNSPEC = 0
INPUT = 1
OUTPUT = 2
"""
An opposite direction map
"""
OPPOSITE_DIRECTION = {
PinDirection.UNSPEC: PinDirection.UNSPEC,
PinDirection.INPUT: PinDirection.OUTPUT,
PinDirection.OUTPUT: PinDirection.INPUT,
}
"""
A generic pin
"""
Pin = namedtuple("Pin", "name direction attrib")
"""
Pin direction in therms where is it "standing out" of a tile.
"""
class PinSide(Enum):
UNSPEC = 0
NORTH = 1
SOUTH = 2
EAST = 3
WEST = 4
"""
This is a generic location in the tilegrid. Note that it also encounters for
the sub-tile index z.
"""
Loc = namedtuple("Loc", "x y z")
"""
FPGA grid quadrant.
"""
Quadrant = namedtuple("Quadrant", "name x0 y0 x1 y1")
"""
Forwads and backward location mapping
"""
LocMap = namedtuple("LocMap", "fwd bwd")
# =============================================================================
"""
A cell type within a tile type representation (should be named "site" ?).
Holds the cell type name and the list of its pins.
"""
CellType = namedtuple("CellType", "type pins")
"""
A cell instance within a tile. Binds a cell name with its type.
type - Cell type
index - Index within the tile
name - Cell name (not necessarly unique)
alias - Cell alias (if present)
"""
Cell = namedtuple("Cell", "type index name alias")
# =============================================================================
class TileType(object):
"""
A tile type representation. The Quicklogic FPGA fabric does not define tiles.
It has rather a group of cells bound to a common geographical location.
"""
def __init__(self, type, cells, fake_const_pin=False):
self.type = type
self.cells = cells
self.pins = []
self.fake_const_pin = fake_const_pin
def make_pins(self, cells_library):
"""
Basing on the cell list and their pins generates the tile pins.
"""
self.pins = []
# Copy pins from all cells. Prefix their names with a cell name.
for cell_type, cell_count in self.cells.items():
for i in range(cell_count):
for pin in cells_library[cell_type].pins:
name = "{}{}_{}".format(cell_type, i, pin.name)
self.pins.append(
Pin(
name=name,
direction=pin.direction,
attrib=pin.attrib
)
)
# Add the fake constant connection pin if marked
if self.fake_const_pin:
self.pins.append(
Pin(
name="FAKE_CONST", direction=PinDirection.INPUT, attrib={}
)
)
"""
A tile instance within a tilegrid
type - Tile type
name - Tile instance name
cells - A list of Cell objects
"""
Tile = namedtuple("Tile", "type name cells")
# =============================================================================
class SwitchboxPinType(Enum):
"""
Switchbox pin types.
"""
UNSPEC = 0 # Unknown.
LOCAL = 1 # Connects to the tile at the same location as the switchbox.
HOP = 2 # Generic hop, connects to another switchbox.
GCLK = 3 # Connects to the global clock network.
CONST = 4 # Connects to the global const network.
FOREIGN = 5 # Connects to a tile at a different location.
"""
A location that identifies a pin inside a switchbox.
stage_id - Stage id
switch_id - Switch id within the stage
mux_id - Mux id within the switch
pin_id - Pin id of the mux
pin_direction - Logical direction of the pin
"""
SwitchboxPinLoc = namedtuple(
"SwitchboxPinLoc", "stage_id switch_id mux_id pin_id pin_direction"
)
"""
A top-level switchbox pin.
in - Pin id.
name - Pin name
direction - Pin direction.
locs - A list of SwitchboxPinLoc objects representing connections to
switches within the switchbox.
type - The pin type as according to SwitchboxPinType
"""
SwitchboxPin = namedtuple("SwitchboxPin", "id name direction locs type")
"""
A switch pin within a switchbox
id - Pin id.
name - Pin name. Only for top-level pins. For others is None.
direction - Pin direction.
"""
SwitchPin = namedtuple("SwitchPin", "id name direction")
"""
A connection within a switchbox
src - Source location (always an output pin)
dst - Destination location (always an input pin)
"""
SwitchConnection = namedtuple("SwitchConnection", "src dst")
"""
Sink timing
tdel - Constant propagation delay.
c - Load capacitance.
vpr_switch - VPR switch name
"""
SinkTiming = namedtuple("SinkTiming", "tdel c vpr_switch")
"""
Driver timing
tdel - Constant propagation delay.
r - Driver resitance.
vpr_switch - VPR switch name
"""
DriverTiming = namedtuple("DriverTiming", "tdel r vpr_switch")
"""
Mux edge timing data
driver - Driver parameters
sink - Sink parameters
"""
MuxEdgeTiming = namedtuple("MuxEdgeTiming", "driver sink")
# =============================================================================
class Switchbox(object):
"""
This class holds information about a routing switchbox of a particular type.
A switchbox is implemented in CLOS architecture. It contains of multiple
"stages". Outputs of previous stage go to the next one. A stage contains
multiple switches. Each switch is a small M-to-N routing box.
"""
class Mux(object):
"""
An individual multiplexer inside a switchbox
"""
def __init__(self, id, switch):
self.id = id # The mux ID
self.switch = switch # Parent switch od
self.inputs = {} # Input pins by their IDs
self.output = None # The output pin
self.timing = {} # Input timing (per input)
@property
def pins(self):
"""
Yields all pins of the mux
"""
for pin in self.inputs.values():
yield pin
yield self.output
class Switch(object):
"""
This is a sub-switchbox of a switchbox stage.
"""
def __init__(self, id, stage):
self.id = id # The switch ID
self.stage = stage # Parent stage id
self.muxes = {} # Muxes by their IDs
@property
def pins(self):
"""
Yields all pins of the switch
"""
for mux in self.muxes.values():
yield from mux.pins
class Stage(object):
"""
Represents a routing stage which has some attributes and consists of
a column of Switch objects
"""
def __init__(self, id, type=None):
self.id = id # The stage ID
self.type = type # The stage type ("HIGHWAY" or "STREET")
self.switches = {} # Switches indexed by their IDs
@property
def pins(self):
"""
Yields all pins of the stage
"""
for switch in self.switches.values():
yield from switch.pins
# ...............................................................
def __init__(self, type):
self.type = type # Switchbox type
self.inputs = {} # Top-level inputs by their names
self.outputs = {} # Top-level outputs by their names
self.stages = {} # Stages by their IDs
self.connections = set() # Connections between stages
@property
def pins(self):
"""
Yields all pins of the switchbox
"""
for pin in self.inputs.values():
yield pin
for pin in self.outputs.values():
yield pin
# =============================================================================
"""
A global clock network cell
type - Cell type.
name - Cell name.
loc - Location in the grid.
quadrant - Clock quadrant
pin_map - A dict with mapping of cell pins to switchbox pins.
"""
ClockCell = namedtuple("ClockCell", "type name loc quadrant pin_map")
# =============================================================================
class ConnectionType(Enum):
"""
Connection endpoint type
"""
UNSPEC = 0 # Unspecified
SWITCHBOX = 1 # Connection to a pin of a switchbox
TILE = 2 # Connection to a pin of a tile
CLOCK = 3 # Connection to a global clock network cell modelled using
# routing resources only.
# A connection endpoint location. Specifies location, pin name and connection
# type.
ConnectionLoc = namedtuple("ConnectionLoc", "loc pin type")
# A connection within the tilegrid
Connection = namedtuple("Connection", "src dst is_direct")
# =============================================================================
"""
A package pin. Holds information about what cells the pin cooresponds to and
where it is in the tilegrid.
name - The pin name
alias - Alias
loc - Location in the physical FPGA gric
cell - Cell object that the package pin correspond to
"""
PackagePin = namedtuple("PackagePin", "name alias loc cell")
# =============================================================================
# VPR segment
VprSegment = namedtuple("VprSegment", "name length r_metal c_metal")
# VPR switch
VprSwitch = namedtuple("VprSwitch", "name type t_del r c_in c_out c_int")