|  | -- This is the database schema for relating a tile grid to a VPR routing | 
|  | -- graph. | 
|  | -- | 
|  | -- Terms: | 
|  | --  grid - A 2D matrix of tiles | 
|  | -- | 
|  | --  phy_tile - A location with the physical grid.  A tile is always of a | 
|  | --         particular tile type.  The tile type specifies what wires, pips and | 
|  | --         sites a tile contains. | 
|  | -- | 
|  | --         The physical grid is defined by the underlying hardware, and has | 
|  | --         expliotable regularity.  However it is not ideal to place using this | 
|  | --         grid, as there are various empty tiles to match the hardware (e.g. | 
|  | --         VBRK tiles). | 
|  | -- | 
|  | --  tile - A location within the VPR grid.  A tile is always of a partial | 
|  | --         tile type.  The tile type specifies what wires, pips and | 
|  | --         sites a tile contains. | 
|  | -- | 
|  | --         The VRP grid may have one phy_tile split across two tiles (e.g. | 
|  | --         CLBLL_L) or may combine multiple phy_tile's into one (e.g. INT_L | 
|  | --         into the tile to it's left. | 
|  | -- | 
|  | --         This table contains the information on the grid output to arch.xml. | 
|  | -- | 
|  | --  wires - A partial net within a tile.  It may start or end at a site pins | 
|  | --          or a pip, or can connect to wires in other tiles. | 
|  | -- | 
|  | --  pip - Programable interconnect point, connecting two wires within a | 
|  | --        tile. | 
|  | -- | 
|  | --  node - A complete net made of one or more wires. | 
|  | -- | 
|  | --  site - A location within a tile that contains site pins and BELs. | 
|  | --         BELs are not described in this database. | 
|  | -- | 
|  | --  site - Site pins are the connections to/from the site to a wire in a | 
|  | --         tile.  A site pin may be associated with one wire in the tile. | 
|  | -- | 
|  | --  graph_node - A VPR type representing either a pb_type IPIN or OPIN or | 
|  | --               a routing wire CHANX or CHANY. | 
|  | -- | 
|  | --               IPIN/OPIN are similiar to site pin. | 
|  | --               CHANX/CHANY are how VPR express routing nodes. | 
|  | -- | 
|  | --  track - A collection of graph_node's that represents one routing node. | 
|  | -- | 
|  | --  graph_edge - A VPR type representing a connection between an IPIN, OPIN, | 
|  | --               CHANX, or CHANY.  All graph_edge's require a switch. | 
|  | -- | 
|  | --  switch - See VPR documentation :http://docs.verilogtorouting.org/en/latest/arch/reference/--tag-fpga-device-information-switch_block | 
|  | -- | 
|  | --  This database provides a relational description between the terms above. | 
|  |  | 
|  | -- Tile type table, used to track tile_type using a pkey, and provide | 
|  | -- the tile_type_pkey <-> name mapping. | 
|  | CREATE TABLE tile_type( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | name TEXT | 
|  | ); | 
|  |  | 
|  | -- Site type table, used to track site_type using a pkey, and provide | 
|  | -- the site_type_pkey <-> name mapping. | 
|  | CREATE TABLE site_type( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | name TEXT | 
|  | ); | 
|  |  | 
|  | CREATE TABLE clock_region( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | name TEXT, | 
|  | x_coord INT, | 
|  | y_coord INT | 
|  | ); | 
|  |  | 
|  | -- Physical tile table, contains type and name of tile and location in the prjxray grid. | 
|  | CREATE TABLE phy_tile( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | name TEXT, | 
|  | tile_type_pkey INT, | 
|  | grid_x INT, | 
|  | grid_y INT, | 
|  | clock_region_pkey INT, | 
|  | FOREIGN KEY(tile_type_pkey) REFERENCES tile_type(pkey), | 
|  | FOREIGN KEY(clock_region_pkey) REFERENCES clock_region(pkey) | 
|  | ); | 
|  |  | 
|  | -- Site pin table, contains names of pins and their direction, along | 
|  | -- with parent site type information. | 
|  | CREATE TABLE site_pin( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | name TEXT, | 
|  | site_type_pkey INT, | 
|  | direction TEXT, | 
|  | FOREIGN KEY(site_type_pkey) REFERENCES site_type(pkey) | 
|  | ); | 
|  |  | 
|  | -- Concreate site instance within tiles.  Used to relate connect | 
|  | -- wire_in_tile instead to site_type's, along with providing metadata | 
|  | -- about the site. | 
|  | CREATE TABLE site( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | name TEXT, | 
|  | x_coord INT, | 
|  | y_coord INT, | 
|  | site_type_pkey INT, | 
|  | tile_type_pkey INT, | 
|  | FOREIGN KEY(site_type_pkey) REFERENCES site_type(pkey), | 
|  | FOREIGN KEY(tile_type_pkey) REFERENCES tile_type(pkey) | 
|  | ); | 
|  |  | 
|  | -- Table recording each site instance in the grid, useful for lookups. | 
|  | CREATE TABLE site_instance( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | name TEXT, | 
|  | x_coord INT, | 
|  | y_coord INT, | 
|  | site_pkey INT, | 
|  | phy_tile_pkey INT, | 
|  | prohibited BOOLEAN, | 
|  | FOREIGN KEY(site_pkey) REFERENCES site(pkey), | 
|  | FOREIGN KEY(phy_tile_pkey) REFERENCES phy_tile(pkey) | 
|  | ); | 
|  |  | 
|  | -- This table provides a reference of synthetic tile types generated to | 
|  | -- support tile splits.  When a tile is split, each contained site becomes a | 
|  | -- new tile type, which is keyed in this table as the "parent_tile_type_pkey". | 
|  | -- | 
|  | -- The tile_type and site that the parent_tile_type_pkey was generated | 
|  | -- from is within the "tile_type_pkey" and "site_pkey". | 
|  | -- | 
|  | -- All tile rows that are split tiles will set site_as_tile_pkey to point to | 
|  | -- a row in this table mapping the synthetic tile_type back to the original | 
|  | -- tile type and site that was used to generate it. | 
|  | CREATE TABLE site_as_tile( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | parent_tile_type_pkey INT, | 
|  | tile_type_pkey INT, | 
|  | site_pkey INT, | 
|  | FOREIGN KEY(parent_tile_type_pkey) REFERENCES tile_type(pkey), | 
|  | FOREIGN KEY(tile_type_pkey) REFERENCES tile_type(pkey), | 
|  | FOREIGN KEY(site_pkey) REFERENCES site(pkey) | 
|  | ); | 
|  |  | 
|  | -- Logical tile table, contains tile type and location within the VPR grid. | 
|  | -- | 
|  | -- For tiles that represent split tiles, site_as_tile_pkey indicates the | 
|  | -- original tile_type and site that was used to generate this tile. | 
|  | -- | 
|  | -- phy_tile_pkey refers to the physical tile that is responsible for holding | 
|  | -- the configuration of this tile.  When multiple tiles are merged, it is only | 
|  | -- legal if only one of the tiles being merged has bitstream output, and that | 
|  | -- physical tile should be referenced here. | 
|  | -- | 
|  | -- If it is neccesary to determine where tiles without bitstream output ended | 
|  | -- up, the tile_map table can be used. | 
|  | CREATE TABLE tile( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | phy_tile_pkey INT, | 
|  | tile_type_pkey INT, | 
|  | site_as_tile_pkey INT, | 
|  | grid_x INT, | 
|  | grid_y INT, | 
|  | FOREIGN KEY(phy_tile_pkey) REFERENCES phy_tile(pkey), | 
|  | FOREIGN KEY(tile_type_pkey) REFERENCES tile_type(pkey), | 
|  | FOREIGN KEY(site_as_tile_pkey) REFERENCES site_as_tile(pkey) | 
|  | ); | 
|  |  | 
|  | -- Bimap between physical and logical grids. | 
|  | -- | 
|  | -- All rows in the tile and phy_tile tables appear at least once. | 
|  | -- | 
|  | -- Both tile_pkey's and phy_tile_pkey's may be repeated depending on what | 
|  | -- operatations were performed to form the VPR grid. Generally speaking, a tile | 
|  | -- split will cause multiple instances of a phy_tile_pkey to appear in this | 
|  | -- table.  A tile merge will cause multiple instances of a tile_pkey to appear | 
|  | -- in this table. | 
|  | CREATE TABLE tile_map( | 
|  | tile_pkey INT, | 
|  | phy_tile_pkey INT, | 
|  | FOREIGN KEY(tile_pkey) REFERENCES tile(pkey), | 
|  | FOREIGN KEY(phy_tile_pkey) REFERENCES phy_tile(pkey) | 
|  | ); | 
|  |  | 
|  | -- Table of switches. | 
|  | CREATE TABLE switch( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | name TEXT, | 
|  | internal_capacitance REAL, | 
|  | drive_resistance REAL, | 
|  | intrinsic_delay REAL, | 
|  | switch_type TEXT | 
|  | ); | 
|  |  | 
|  | -- Table of segments. | 
|  | -- VPR's map lookahead uses segments to determine "wire types".  Each | 
|  | -- significantly different interconnect type should have a segment. | 
|  | CREATE TABLE segment( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | name TEXT, | 
|  | length INT | 
|  | ); | 
|  |  | 
|  | -- Table of tile type wires. This table is the of uninstanced tile type | 
|  | -- wires. Site pins wires will reference their site and site pin rows in | 
|  | -- the site and site_pin tables. | 
|  | -- | 
|  | -- All concrete wire instances will related to a row in this table. | 
|  | CREATE TABLE wire_in_tile( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | name TEXT, | 
|  | phy_tile_type_pkey INT, | 
|  | tile_type_pkey INT, | 
|  | site_pkey INT, | 
|  | site_pin_pkey INT, | 
|  | capacitance REAL, | 
|  | resistance REAL, | 
|  | site_pin_switch_pkey INT, | 
|  | FOREIGN KEY(phy_tile_type_pkey) REFERENCES phy_tile_type(pkey), | 
|  | FOREIGN KEY(tile_type_pkey) REFERENCES tile_type(pkey), | 
|  | FOREIGN KEY(site_pkey) REFERENCES site(pkey), | 
|  | FOREIGN KEY(site_pin_pkey) REFERENCES site_pin(pkey), | 
|  | FOREIGN KEY(site_pin_switch_pkey) REFERENCES switch(pkey) | 
|  | ); | 
|  |  | 
|  | -- Table of tile type pips.  This table is the table of uninstanced pips. | 
|  | -- No concreate table of pips is created, instead this table is used to | 
|  | -- add rows in the graph_edge table. | 
|  | CREATE TABLE pip_in_tile( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | name TEXT, | 
|  | tile_type_pkey INT, | 
|  | src_wire_in_tile_pkey INT, | 
|  | dest_wire_in_tile_pkey INT, | 
|  | can_invert BOOLEAN, | 
|  | is_directional BOOLEAN, | 
|  | is_pseudo BOOLEAN, | 
|  | is_pass_transistor BOOLEAN, | 
|  | switch_pkey INT, | 
|  | backward_switch_pkey INT, | 
|  | FOREIGN KEY(tile_type_pkey) REFERENCES tile_type(pkey), | 
|  | FOREIGN KEY(src_wire_in_tile_pkey) REFERENCES wire_in_tile(pkey), | 
|  | FOREIGN KEY(dest_wire_in_tile_pkey) REFERENCES wire_in_tile(pkey), | 
|  | FOREIGN KEY(switch_pkey) REFERENCES switch(pkey), | 
|  | FOREIGN KEY(backward_switch_pkey) REFERENCES switch(pkey) | 
|  | ); | 
|  |  | 
|  | -- Table for find pips associated with a wire_in_tile_pkey, without considering | 
|  | -- the direction of the pip. | 
|  | CREATE TABLE undirected_pips( | 
|  | wire_in_tile_pkey INT, | 
|  | pip_in_tile_pkey INT, | 
|  | other_wire_in_tile_pkey INT, | 
|  | FOREIGN KEY(wire_in_tile_pkey) REFERENCES wire_in_tile(pkey), | 
|  | FOREIGN KEY(pip_in_tile_pkey) REFERENCES pip_in_tile(pkey), | 
|  | FOREIGN KEY(other_wire_in_tile_pkey) REFERENCES wire_in_tile(pkey) | 
|  | ); | 
|  |  | 
|  |  | 
|  | -- Table of tracks. alive is a flag used during routing import to indicate | 
|  | -- whether this a particular track is connected and should be imported. | 
|  | CREATE TABLE track( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | alive BOOL, | 
|  | segment_pkey INT, | 
|  | canon_phy_tile_pkey INT, | 
|  | FOREIGN KEY(segment_pkey) REFERENCES segment_pkey(pkey), | 
|  | FOREIGN KEY(canon_phy_tile_pkey) REFERENCES phy_tile(pkey) | 
|  | ); | 
|  |  | 
|  | -- Table of nodes.  Provides the concrete relation for connected wire | 
|  | -- instances. Generally speaking nodes are either routing nodes or a site | 
|  | -- pin node. | 
|  | -- | 
|  | -- Routing nodes will have track_pkey set. | 
|  | -- Site pin nodes will have a site_wire_pkey to the wire that is the wire | 
|  | -- connected to a site pin. | 
|  | CREATE TABLE node( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | number_pips INT, | 
|  | track_pkey INT, | 
|  | site_wire_pkey INT, | 
|  | classification INT, | 
|  | FOREIGN KEY(track_pkey) REFERENCES track_pkey(pkey), | 
|  | FOREIGN KEY(site_wire_pkey) REFERENCES wire(pkey) | 
|  | ); | 
|  |  | 
|  | -- Table of edge with mux.  An edge_with_mux needs special handling in VPR, | 
|  | -- in the form of architecture level direct connections. | 
|  | -- | 
|  | -- This table is the list of these direct connections. | 
|  | CREATE TABLE edge_with_mux( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | src_wire_pkey INT, | 
|  | dest_wire_pkey INT, | 
|  | pip_in_tile_pkey INT, | 
|  | switch_pkey INT, | 
|  | FOREIGN KEY(src_wire_pkey) REFERENCES wire(pkey), | 
|  | FOREIGN KEY(dest_wire_pkey) REFERENCES wire(pkey), | 
|  | FOREIGN KEY(pip_in_tile_pkey) REFERENCES pip_in_tile(pkey), | 
|  | FOREIGN KEY(switch_pkey) REFERENCES switch(pkey) | 
|  | ); | 
|  |  | 
|  | -- Table of graph nodes.  This is a direction mapping of an VPR rr_node | 
|  | -- instance. | 
|  | CREATE TABLE graph_node( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | graph_node_type INT, | 
|  | track_pkey INT, | 
|  | connection_box_wire_pkey INT, | 
|  | node_pkey INT, | 
|  | x_low INT, | 
|  | x_high INT, | 
|  | y_low INT, | 
|  | y_high INT, | 
|  | ptc INT, | 
|  | capacity INT, | 
|  | capacitance REAL, | 
|  | resistance REAL, | 
|  | FOREIGN KEY(connection_box_wire_pkey) REFERENCES wire(pkey), | 
|  | FOREIGN KEY(track_pkey) REFERENCES track(pkey), | 
|  | FOREIGN KEY(node_pkey) REFERENCES node(pkey) | 
|  | ); | 
|  |  | 
|  | -- Table of wires.  This table is the complete list of all wires in the | 
|  | -- grid. All wires will belong to exactly one node. | 
|  | -- | 
|  | -- Rows will relate back to their parent tile, and generic wire instance. | 
|  | -- | 
|  | -- If the wire is connected to both a site pin and a pip, then | 
|  | -- top_graph_node_pkey, bottom_graph_node_pkey, left_graph_node_pkey, and | 
|  | -- right_graph_node_pkey will be set to the IPIN or OPIN instances, based | 
|  | -- on the pin directions for the tile. | 
|  | -- | 
|  | -- If the wire is a member of a routing node, then graph_node_pkey will be | 
|  | -- set to the graph_node this wire is a member of. | 
|  | -- | 
|  | -- The wire has two columns for tile location.  phy_tile_pkey points to the | 
|  | -- physical prjxray tile that contains this wire.  The tile_pkey points to the | 
|  | -- VPR tile that contains this wire. | 
|  | -- | 
|  | -- Do note that unless this wire is connected to a IPIN or OPIN, VPR does not | 
|  | -- model exact tile locations for wires.  Instead the wire will have been | 
|  | -- lumped into a CHANX or CHANY node. | 
|  | CREATE TABLE wire( | 
|  | pkey INTEGER PRIMARY KEY, | 
|  | node_pkey INT, | 
|  | phy_tile_pkey INT, | 
|  | tile_pkey INT, | 
|  | wire_in_tile_pkey INT, | 
|  | graph_node_pkey INT, | 
|  | top_graph_node_pkey INT, | 
|  | bottom_graph_node_pkey INT, | 
|  | left_graph_node_pkey INT, | 
|  | right_graph_node_pkey INT, | 
|  | site_pin_graph_node_pkey INT, | 
|  | FOREIGN KEY(node_pkey) REFERENCES node(pkey), | 
|  | FOREIGN KEY(phy_tile_pkey) REFERENCES phy_tile(pkey), | 
|  | FOREIGN KEY(tile_pkey) REFERENCES tile(pkey), | 
|  | FOREIGN KEY(wire_in_tile_pkey) REFERENCES wire_in_tile(pkey), | 
|  | FOREIGN KEY(graph_node_pkey) REFERENCES graph_node(pkey), | 
|  | FOREIGN KEY(top_graph_node_pkey) REFERENCES graph_node(pkey), | 
|  | FOREIGN KEY(bottom_graph_node_pkey) REFERENCES graph_node(pkey), | 
|  | FOREIGN KEY(left_graph_node_pkey) REFERENCES graph_node(pkey), | 
|  | FOREIGN KEY(right_graph_node_pkey) REFERENCES graph_node(pkey), | 
|  | FOREIGN KEY(site_pin_graph_node_pkey) REFERENCES graph_node(pkey) | 
|  | ); | 
|  |  | 
|  | -- Table of graph edges. | 
|  | CREATE TABLE graph_edge( | 
|  | src_graph_node_pkey INT, | 
|  | dest_graph_node_pkey INT, | 
|  | switch_pkey INT, | 
|  | track_pkey INT, | 
|  | phy_tile_pkey INT, | 
|  | pip_in_tile_pkey INT, | 
|  | backward BOOLEAN, | 
|  | FOREIGN KEY(src_graph_node_pkey) REFERENCES graph_node(pkey), | 
|  | FOREIGN KEY(dest_graph_node_pkey) REFERENCES graph_node(pkey), | 
|  | FOREIGN KEY(track_pkey) REFERENCES track(pkey), | 
|  | FOREIGN KEY(phy_tile_pkey) REFERENCES phy_tile(pkey), | 
|  | FOREIGN KEY(pip_in_tile_pkey) REFERENCES pip(pkey) | 
|  | ); | 
|  |  | 
|  | -- channel, x_list and y_list are direct mappings of the channel object | 
|  | -- present in the rr_graph. | 
|  | CREATE TABLE channel( | 
|  | chan_width_max INT, | 
|  | x_min INT, | 
|  | y_min INT, | 
|  | x_max INT, | 
|  | y_max INT | 
|  | ); | 
|  | CREATE TABLE x_list( | 
|  | idx INT, | 
|  | info INT | 
|  | ); | 
|  | CREATE TABLE y_list( | 
|  | idx INT, | 
|  | info INT | 
|  | ); | 
|  |  | 
|  | -- Table that represents the (optional) VCC and GND global sources. | 
|  | -- VPR cannot natively take advantage of local VCC and GND sources, so | 
|  | -- a global source is generated, and local sources will connect to the global | 
|  | -- sources. | 
|  | CREATE TABLE constant_sources( | 
|  | vcc_track_pkey INT, | 
|  | gnd_track_pkey INT, | 
|  | FOREIGN KEY(vcc_track_pkey) REFERENCES track(pkey), | 
|  | FOREIGN KEY(gnd_track_pkey) REFERENCES track(pkey) | 
|  | ); |