| #!/usr/bin/env python3 |
| """ Creates graph nodes and edges in connection database. |
| |
| For ROI configurations, pips that would intefer with the ROI are not emitted, |
| and connections that lies outside the ROI are ignored. |
| |
| Rough structure: |
| |
| Add graph_nodes for all IPIN's and OPIN's in the grid based on pin assignments. |
| |
| Collect tracks used by the ROI (if in used) to prevent tracks from being used |
| twice. |
| |
| Make graph edges based on pips in every tile. |
| |
| Compute which routing tracks are alive based on whether they have at least one |
| edge that sinks and one edge that sources the routing node. |
| |
| Build final channels based on alive tracks and insert dummy CHANX or CHANY to |
| fill empty spaces. This is required by VPR to allocate the right data. |
| |
| """ |
| |
| import argparse |
| import datetime |
| import sqlite3 |
| |
| from prjxray_edge_library import ( |
| create_edges, |
| build_channels, |
| set_track_canonical_loc, |
| annotate_pin_feeds, |
| compute_segment_lengths, |
| verify_channels, |
| ) |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument( |
| '--db_root', required=True, help='Project X-Ray Database' |
| ) |
| parser.add_argument('--part', required=True, help='FPGA part') |
| parser.add_argument( |
| '--connection_database', |
| help='Database of fabric connectivity', |
| required=True |
| ) |
| parser.add_argument( |
| '--pin_assignments', help='Pin assignments JSON', required=True |
| ) |
| parser.add_argument( |
| '--synth_tiles', |
| help='If using an ROI or Overlay, \ |
| synthetic tile defintion from prjxray-arch-import' |
| ) |
| parser.add_argument( |
| '--overlay', |
| action='store_true', |
| required=False, |
| help='Use synth tiles for Overlay instead of ROI' |
| ) |
| parser.add_argument( |
| '--graph_limit', |
| help='Limit grid to specified dimensions in x_min,y_min,x_max,y_max', |
| ) |
| |
| args = parser.parse_args() |
| |
| now = datetime.datetime.now |
| print("{}: Creating edges".format(now())) |
| ccio_sites = create_edges(args) |
| print("{}: Done with edges".format(now())) |
| |
| with sqlite3.connect(args.connection_database) as conn: |
| print("{}: Build channels".format(now())) |
| build_channels(conn) |
| print("{}: Channels built".format(now())) |
| |
| with sqlite3.connect(args.connection_database) as conn: |
| print('{} Set track canonical loc'.format(now())) |
| set_track_canonical_loc(conn) |
| |
| print('{} Annotate pin feeds'.format(now())) |
| annotate_pin_feeds(conn, ccio_sites) |
| |
| print('{} Compute segment lengths'.format(now())) |
| compute_segment_lengths(conn) |
| |
| print( |
| '{} Flushing database back to file "{}"'.format( |
| now(), args.connection_database |
| ) |
| ) |
| |
| with sqlite3.connect('file:{}?mode=ro'.format(args.connection_database), |
| uri=True) as conn: |
| verify_channels(conn) |
| print("{}: Channels verified".format(now())) |
| |
| |
| if __name__ == '__main__': |
| main() |