Merge pull request #1772 from lnis-uofu/xt_fkey
[core] fixed a bug where pb pin fixup does not support perimeter cb
This commit is contained in:
commit
0edd5529c3
|
@ -10,7 +10,8 @@ RRClockSpatialLookup::RRClockSpatialLookup() {}
|
|||
RRNodeId RRClockSpatialLookup::find_node(int x, int y, const ClockTreeId& tree,
|
||||
const ClockLevelId& lvl,
|
||||
const ClockTreePinId& pin,
|
||||
const Direction& direction) const {
|
||||
const Direction& direction,
|
||||
const bool& verbose) const {
|
||||
size_t dir = size_t(direction);
|
||||
/* Pre-check: the x, y, side and ptc should be non negative numbers!
|
||||
* Otherwise, return an invalid id */
|
||||
|
@ -25,33 +26,33 @@ RRNodeId RRClockSpatialLookup::find_node(int x, int y, const ClockTreeId& tree,
|
|||
* - Return an invalid id if any out-of-range is detected
|
||||
*/
|
||||
if (size_t(dir) >= rr_node_indices_.size()) {
|
||||
VTR_LOG("Direction out of range");
|
||||
VTR_LOGV(verbose, "Direction out of range\n");
|
||||
return RRNodeId::INVALID();
|
||||
}
|
||||
|
||||
if (size_t(x) >= rr_node_indices_[dir].dim_size(0)) {
|
||||
VTR_LOG("X out of range");
|
||||
VTR_LOGV(verbose, "X out of range\n");
|
||||
return RRNodeId::INVALID();
|
||||
}
|
||||
|
||||
if (size_t(y) >= rr_node_indices_[dir].dim_size(1)) {
|
||||
VTR_LOG("Y out of range");
|
||||
VTR_LOG("Y out of range\n");
|
||||
return RRNodeId::INVALID();
|
||||
}
|
||||
|
||||
if (size_t(tree) >= rr_node_indices_[dir][x][y].size()) {
|
||||
VTR_LOG("Tree id out of range");
|
||||
VTR_LOGV(verbose, "Tree id out of range\n");
|
||||
return RRNodeId::INVALID();
|
||||
}
|
||||
|
||||
if (size_t(lvl) == rr_node_indices_[dir][x][y][size_t(tree)].size()) {
|
||||
VTR_LOG("Level id out of range");
|
||||
VTR_LOGV(verbose, "Level id out of range\n");
|
||||
return RRNodeId::INVALID();
|
||||
}
|
||||
|
||||
if (size_t(pin) ==
|
||||
rr_node_indices_[dir][x][y][size_t(tree)][size_t(lvl)].size()) {
|
||||
VTR_LOG("Pin id out of range");
|
||||
VTR_LOGV(verbose, "Pin id out of range\n");
|
||||
return RRNodeId::INVALID();
|
||||
}
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@ class RRClockSpatialLookup {
|
|||
*/
|
||||
RRNodeId find_node(int x, int y, const ClockTreeId& tree,
|
||||
const ClockLevelId& lvl, const ClockTreePinId& pin,
|
||||
const Direction& direction) const;
|
||||
const Direction& direction, const bool& verbose) const;
|
||||
|
||||
/* -- Mutators -- */
|
||||
public:
|
||||
|
|
|
@ -262,7 +262,7 @@ static std::vector<RRNodeId> find_clock_track2track_node(
|
|||
const RRClockSpatialLookup& clk_rr_lookup, const t_rr_type& chan_type,
|
||||
const vtr::Point<size_t>& chan_coord, const ClockTreeId& clk_tree,
|
||||
const ClockLevelId& clk_lvl, const ClockTreePinId& clk_pin,
|
||||
const Direction& direction) {
|
||||
const Direction& direction, const bool& verbose) {
|
||||
std::vector<RRNodeId> des_nodes;
|
||||
|
||||
/* Straight connection */
|
||||
|
@ -285,7 +285,7 @@ static std::vector<RRNodeId> find_clock_track2track_node(
|
|||
}
|
||||
RRNodeId straight_des_node =
|
||||
clk_rr_lookup.find_node(straight_des_coord.x(), straight_des_coord.y(),
|
||||
clk_tree, clk_lvl, clk_pin, direction);
|
||||
clk_tree, clk_lvl, clk_pin, direction, verbose);
|
||||
if (rr_graph_view.valid_node(straight_des_node)) {
|
||||
VTR_ASSERT(chan_type == rr_graph_view.node_type(straight_des_node));
|
||||
des_nodes.push_back(straight_des_node);
|
||||
|
@ -344,7 +344,7 @@ static std::vector<RRNodeId> find_clock_track2track_node(
|
|||
}
|
||||
RRNodeId left_des_node =
|
||||
clk_rr_lookup.find_node(left_des_coord.x(), left_des_coord.y(), clk_tree,
|
||||
next_clk_lvl, clk_pin, left_direction);
|
||||
next_clk_lvl, clk_pin, left_direction, verbose);
|
||||
if (rr_graph_view.valid_node(left_des_node)) {
|
||||
VTR_ASSERT(left_des_chan_type == rr_graph_view.node_type(left_des_node));
|
||||
des_nodes.push_back(left_des_node);
|
||||
|
@ -396,7 +396,7 @@ static std::vector<RRNodeId> find_clock_track2track_node(
|
|||
}
|
||||
RRNodeId right_des_node =
|
||||
clk_rr_lookup.find_node(right_des_coord.x(), right_des_coord.y(), clk_tree,
|
||||
next_clk_lvl, clk_pin, right_direction);
|
||||
next_clk_lvl, clk_pin, right_direction, verbose);
|
||||
if (rr_graph_view.valid_node(right_des_node)) {
|
||||
VTR_ASSERT(right_des_chan_type == rr_graph_view.node_type(right_des_node));
|
||||
des_nodes.push_back(right_des_node);
|
||||
|
@ -535,7 +535,7 @@ static void add_rr_graph_block_clock_edges(
|
|||
/* find the driver clock node through lookup */
|
||||
RRNodeId src_node =
|
||||
clk_rr_lookup.find_node(chan_coord.x(), chan_coord.y(), itree, ilvl,
|
||||
ClockTreePinId(ipin), node_dir);
|
||||
ClockTreePinId(ipin), node_dir, verbose);
|
||||
VTR_LOGV(verbose,
|
||||
"Try to find node '%lu' from clock node lookup (x='%lu' "
|
||||
"y='%lu' tree='%lu' level='%lu' pin='%lu' direction='%s')\n",
|
||||
|
@ -548,7 +548,8 @@ static void add_rr_graph_block_clock_edges(
|
|||
size_t curr_edge_count = edge_count;
|
||||
for (RRNodeId des_node : find_clock_track2track_node(
|
||||
rr_graph_view, clk_ntwk, clk_rr_lookup, chan_type,
|
||||
chan_coord, itree, ilvl, ClockTreePinId(ipin), node_dir)) {
|
||||
chan_coord, itree, ilvl, ClockTreePinId(ipin), node_dir,
|
||||
verbose)) {
|
||||
/* Create edges */
|
||||
VTR_ASSERT(rr_graph_view.valid_node(des_node));
|
||||
rr_graph_builder.create_edge(
|
||||
|
@ -593,7 +594,7 @@ static void try_find_and_add_clock_opin2track_node(
|
|||
const RRGraphView& rr_graph_view, const size_t& layer,
|
||||
const vtr::Point<int>& grid_coord, const e_side& pin_side,
|
||||
const ClockNetwork& clk_ntwk, const ClockTreePinId& clk_pin,
|
||||
const ClockInternalDriverId& int_driver_id) {
|
||||
const ClockInternalDriverId& int_driver_id, const bool& verbose) {
|
||||
t_physical_tile_type_ptr grid_type = grids.get_physical_type(
|
||||
t_physical_tile_loc(grid_coord.x(), grid_coord.y(), layer));
|
||||
for (std::string tap_pin_name :
|
||||
|
@ -606,6 +607,8 @@ static void try_find_and_add_clock_opin2track_node(
|
|||
RRNodeId opin_node = rr_graph_view.node_lookup().find_node(
|
||||
layer, grid_coord.x(), grid_coord.y(), OPIN, grid_pin_idx, pin_side);
|
||||
if (rr_graph_view.valid_node(opin_node)) {
|
||||
VTR_LOGV(verbose, "Connected OPIN '%s' to clock network\n",
|
||||
tap_pin_name.c_str());
|
||||
opin_nodes.push_back(opin_node);
|
||||
}
|
||||
}
|
||||
|
@ -639,7 +642,8 @@ static std::vector<RRNodeId> find_clock_opin2track_node(
|
|||
const DeviceGrid& grids, const RRGraphView& rr_graph_view,
|
||||
const size_t& layer, const vtr::Point<int>& sb_coord,
|
||||
const ClockNetwork& clk_ntwk, const ClockTreePinId& clk_pin,
|
||||
const std::vector<ClockInternalDriverId>& int_driver_ids) {
|
||||
const std::vector<ClockInternalDriverId>& int_driver_ids,
|
||||
const bool& verbose) {
|
||||
std::vector<RRNodeId> opin_nodes;
|
||||
/* Find opins from
|
||||
* - Grid[x][y+1] on right and bottom sides
|
||||
|
@ -663,7 +667,7 @@ static std::vector<RRNodeId> find_clock_opin2track_node(
|
|||
for (ClockInternalDriverId int_driver_id : int_driver_ids) {
|
||||
try_find_and_add_clock_opin2track_node(
|
||||
opin_nodes, grids, rr_graph_view, layer, grid_coord, grid_side,
|
||||
clk_ntwk, clk_pin, int_driver_id);
|
||||
clk_ntwk, clk_pin, int_driver_id, verbose);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -702,9 +706,9 @@ static int add_rr_graph_opin2clk_edges(
|
|||
vtr::Point<int> des_coord = clk_ntwk.spine_start_point(des_spine);
|
||||
Direction des_spine_direction = clk_ntwk.spine_direction(des_spine);
|
||||
ClockLevelId des_spine_level = clk_ntwk.spine_level(des_spine);
|
||||
RRNodeId des_node =
|
||||
clk_rr_lookup.find_node(des_coord.x(), des_coord.y(), clk_tree,
|
||||
des_spine_level, ipin, des_spine_direction);
|
||||
RRNodeId des_node = clk_rr_lookup.find_node(
|
||||
des_coord.x(), des_coord.y(), clk_tree, des_spine_level, ipin,
|
||||
des_spine_direction, verbose);
|
||||
/* Walk through each qualified OPIN, build edges */
|
||||
vtr::Point<int> src_coord =
|
||||
clk_ntwk.spine_switch_point(ispine, switch_point_id);
|
||||
|
@ -713,7 +717,7 @@ static int add_rr_graph_opin2clk_edges(
|
|||
switch_point_id);
|
||||
for (RRNodeId src_node : find_clock_opin2track_node(
|
||||
grids, rr_graph_view, layer, src_coord, clk_ntwk, ipin,
|
||||
int_driver_ids)) {
|
||||
int_driver_ids, verbose)) {
|
||||
/* Create edges */
|
||||
VTR_ASSERT(rr_graph_view.valid_node(des_node));
|
||||
rr_graph_builder.create_edge(
|
||||
|
|
|
@ -97,23 +97,24 @@ static int route_clock_spine_switch_point(
|
|||
const ClockNetwork& clk_ntwk, const ClockTreeId& clk_tree,
|
||||
const ClockSpineId& ispine, const ClockTreePinId& ipin,
|
||||
const ClockSwitchPointId& switch_point_id, const bool& verbose) {
|
||||
VTR_LOGV(verbose, "Routing switch points of spine '%s'...\n",
|
||||
clk_ntwk.spine_name(ispine).c_str());
|
||||
vtr::Point<int> src_coord =
|
||||
clk_ntwk.spine_switch_point(ispine, switch_point_id);
|
||||
ClockSpineId des_spine =
|
||||
clk_ntwk.spine_switch_point_tap(ispine, switch_point_id);
|
||||
vtr::Point<int> des_coord = clk_ntwk.spine_start_point(des_spine);
|
||||
VTR_LOGV(verbose, "Routing switch points from spine '%s' to spine '%s'...\n",
|
||||
clk_ntwk.spine_name(ispine).c_str(),
|
||||
clk_ntwk.spine_name(des_spine).c_str());
|
||||
Direction src_spine_direction = clk_ntwk.spine_direction(ispine);
|
||||
Direction des_spine_direction = clk_ntwk.spine_direction(des_spine);
|
||||
ClockLevelId src_spine_level = clk_ntwk.spine_level(ispine);
|
||||
ClockLevelId des_spine_level = clk_ntwk.spine_level(des_spine);
|
||||
RRNodeId src_node =
|
||||
clk_rr_lookup.find_node(src_coord.x(), src_coord.y(), clk_tree,
|
||||
src_spine_level, ipin, src_spine_direction);
|
||||
RRNodeId des_node =
|
||||
clk_rr_lookup.find_node(des_coord.x(), des_coord.y(), clk_tree,
|
||||
des_spine_level, ipin, des_spine_direction);
|
||||
RRNodeId src_node = clk_rr_lookup.find_node(src_coord.x(), src_coord.y(),
|
||||
clk_tree, src_spine_level, ipin,
|
||||
src_spine_direction, verbose);
|
||||
RRNodeId des_node = clk_rr_lookup.find_node(des_coord.x(), des_coord.y(),
|
||||
clk_tree, des_spine_level, ipin,
|
||||
des_spine_direction, verbose);
|
||||
VTR_ASSERT(rr_graph.valid_node(src_node));
|
||||
VTR_ASSERT(rr_graph.valid_node(des_node));
|
||||
/* Internal drivers may appear at the switch point. Check if there are
|
||||
|
@ -200,9 +201,9 @@ static int route_spine_taps(
|
|||
vtr::Point<int> src_coord = spine_coords[icoord];
|
||||
Direction src_spine_direction = clk_ntwk.spine_direction(ispine);
|
||||
ClockLevelId src_spine_level = clk_ntwk.spine_level(ispine);
|
||||
RRNodeId src_node =
|
||||
clk_rr_lookup.find_node(src_coord.x(), src_coord.y(), clk_tree,
|
||||
src_spine_level, ipin, src_spine_direction);
|
||||
RRNodeId src_node = clk_rr_lookup.find_node(
|
||||
src_coord.x(), src_coord.y(), clk_tree, src_spine_level, ipin,
|
||||
src_spine_direction, verbose);
|
||||
for (RREdgeId edge : rr_graph.edge_range(src_node)) {
|
||||
RRNodeId des_node = rr_graph.edge_sink_node(edge);
|
||||
if (rr_graph.node_type(des_node) == IPIN) {
|
||||
|
@ -389,12 +390,12 @@ static int rec_expand_and_route_clock_spine(
|
|||
Direction des_spine_direction = clk_ntwk.spine_direction(curr_spine);
|
||||
ClockLevelId src_spine_level = clk_ntwk.spine_level(curr_spine);
|
||||
ClockLevelId des_spine_level = clk_ntwk.spine_level(curr_spine);
|
||||
RRNodeId src_node =
|
||||
clk_rr_lookup.find_node(src_coord.x(), src_coord.y(), clk_tree,
|
||||
src_spine_level, curr_pin, src_spine_direction);
|
||||
RRNodeId des_node =
|
||||
clk_rr_lookup.find_node(des_coord.x(), des_coord.y(), clk_tree,
|
||||
des_spine_level, curr_pin, des_spine_direction);
|
||||
RRNodeId src_node = clk_rr_lookup.find_node(
|
||||
src_coord.x(), src_coord.y(), clk_tree, src_spine_level, curr_pin,
|
||||
src_spine_direction, verbose);
|
||||
RRNodeId des_node = clk_rr_lookup.find_node(
|
||||
des_coord.x(), des_coord.y(), clk_tree, des_spine_level, curr_pin,
|
||||
des_spine_direction, verbose);
|
||||
VTR_ASSERT(rr_graph.valid_node(src_node));
|
||||
VTR_ASSERT(rr_graph.valid_node(des_node));
|
||||
VTR_LOGV(verbose,
|
||||
|
|
|
@ -36,7 +36,8 @@ static void update_cluster_pin_with_post_routing_results(
|
|||
const VprRoutingAnnotation& vpr_routing_annotation,
|
||||
VprClusteringAnnotation& vpr_clustering_annotation, const size_t& layer,
|
||||
const vtr::Point<size_t>& grid_coord, const ClusterBlockId& blk_id,
|
||||
const e_side& border_side, const size_t& z, const bool& verbose) {
|
||||
const e_side& border_side, const size_t& z, const bool& perimeter_cb,
|
||||
const bool& verbose) {
|
||||
/* Handle each pin */
|
||||
auto logical_block = clustering_ctx.clb_nlist.block_type(blk_id);
|
||||
auto physical_tile = device_ctx.grid.get_physical_type(
|
||||
|
@ -76,6 +77,13 @@ static void update_cluster_pin_with_post_routing_results(
|
|||
if (NUM_SIDES == border_side) {
|
||||
VTR_ASSERT(1 == pin_sides.size());
|
||||
pin_side = pin_sides[0];
|
||||
} else if (perimeter_cb) {
|
||||
/* When perimeter connection blcoks are allowed, I/O pins may occur on any
|
||||
* side but the border side */
|
||||
VTR_ASSERT(pin_sides.end() ==
|
||||
std::find(pin_sides.begin(), pin_sides.end(), border_side));
|
||||
VTR_ASSERT(1 == pin_sides.size());
|
||||
pin_side = pin_sides[0];
|
||||
} else {
|
||||
SideManager side_manager(border_side);
|
||||
VTR_ASSERT(pin_sides.end() != std::find(pin_sides.begin(),
|
||||
|
@ -188,7 +196,8 @@ void update_pb_pin_with_post_routing_results(
|
|||
const DeviceContext& device_ctx, const ClusteringContext& clustering_ctx,
|
||||
const PlacementContext& placement_ctx,
|
||||
const VprRoutingAnnotation& vpr_routing_annotation,
|
||||
VprClusteringAnnotation& vpr_clustering_annotation, const bool& verbose) {
|
||||
VprClusteringAnnotation& vpr_clustering_annotation, const bool& perimeter_cb,
|
||||
const bool& verbose) {
|
||||
/* Ensure a clean start: remove all the remapping results from VTR's
|
||||
* post-routing clustering result sync-up */
|
||||
vpr_clustering_annotation.clear_net_remapping();
|
||||
|
@ -219,7 +228,7 @@ void update_pb_pin_with_post_routing_results(
|
|||
device_ctx, clustering_ctx, vpr_routing_annotation,
|
||||
vpr_clustering_annotation, layer, grid_coord, cluster_blk_id,
|
||||
NUM_SIDES, placement_ctx.block_locs[cluster_blk_id].loc.sub_tile,
|
||||
verbose);
|
||||
perimeter_cb, verbose);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -250,7 +259,8 @@ void update_pb_pin_with_post_routing_results(
|
|||
update_cluster_pin_with_post_routing_results(
|
||||
device_ctx, clustering_ctx, vpr_routing_annotation,
|
||||
vpr_clustering_annotation, layer, io_coord, cluster_blk_id, io_side,
|
||||
placement_ctx.block_locs[cluster_blk_id].loc.sub_tile, verbose);
|
||||
placement_ctx.block_locs[cluster_blk_id].loc.sub_tile, perimeter_cb,
|
||||
verbose);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,7 +18,8 @@ void update_pb_pin_with_post_routing_results(
|
|||
const DeviceContext& device_ctx, const ClusteringContext& clustering_ctx,
|
||||
const PlacementContext& placement_ctx,
|
||||
const VprRoutingAnnotation& vpr_routing_annotation,
|
||||
VprClusteringAnnotation& vpr_clustering_annotation, const bool& verbose);
|
||||
VprClusteringAnnotation& vpr_clustering_annotation, const bool& perimeter_cb,
|
||||
const bool& verbose);
|
||||
|
||||
} /* end namespace openfpga */
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@ int pb_pin_fixup_template(T& openfpga_context, const Command& cmd,
|
|||
g_vpr_ctx.device(), g_vpr_ctx.clustering(), g_vpr_ctx.placement(),
|
||||
openfpga_context.vpr_routing_annotation(),
|
||||
openfpga_context.mutable_vpr_clustering_annotation(),
|
||||
g_vpr_ctx.device().arch->perimeter_cb,
|
||||
cmd_context.option_enable(cmd, opt_verbose));
|
||||
|
||||
/* TODO: should identify the error code from internal function execution */
|
||||
|
|
|
@ -1247,9 +1247,9 @@ static int build_top_module_global_net_from_tile_clock_arch_tree(
|
|||
Direction entry_dir = clk_ntwk.spine_direction(spine);
|
||||
t_rr_type entry_track_type = clk_ntwk.spine_track_type(spine);
|
||||
/* Find the routing resource node of the entry point */
|
||||
RRNodeId entry_rr_node =
|
||||
rr_clock_lookup.find_node(entry_point.x(), entry_point.y(), clk_tree,
|
||||
clk_ntwk.spine_level(spine), pin, entry_dir);
|
||||
RRNodeId entry_rr_node = rr_clock_lookup.find_node(
|
||||
entry_point.x(), entry_point.y(), clk_tree, clk_ntwk.spine_level(spine),
|
||||
pin, entry_dir, false);
|
||||
|
||||
/* Get the tile module and instance at the entry point */
|
||||
const RRGSB& rr_gsb = device_rr_gsb.get_gsb_by_cb_coordinate(
|
||||
|
|
|
@ -1282,9 +1282,9 @@ static int build_top_module_global_net_from_clock_arch_tree(
|
|||
Direction entry_dir = clk_ntwk.spine_direction(spine);
|
||||
t_rr_type entry_track_type = clk_ntwk.spine_track_type(spine);
|
||||
/* Find the routing resource node of the entry point */
|
||||
RRNodeId entry_rr_node =
|
||||
rr_clock_lookup.find_node(entry_point.x(), entry_point.y(), clk_tree,
|
||||
clk_ntwk.spine_level(spine), pin, entry_dir);
|
||||
RRNodeId entry_rr_node = rr_clock_lookup.find_node(
|
||||
entry_point.x(), entry_point.y(), clk_tree, clk_ntwk.spine_level(spine),
|
||||
pin, entry_dir, false);
|
||||
|
||||
/* Get the connection block module and instance at the entry point */
|
||||
vtr::Point<size_t> entry_cb_coord(entry_point.x(), entry_point.y());
|
||||
|
|
|
@ -198,6 +198,7 @@ run-task basic_tests/tile_organization/homo_fabric_tile_bl $@
|
|||
echo -e "Testing tile grouping on a homogeneous FPGA fabric (Preconfigured testbench)";
|
||||
run-task basic_tests/tile_organization/fabric_tile_global_tile_clock_io_subtile $@
|
||||
run-task basic_tests/tile_organization/fabric_tile_perimeter_cb_global_tile_clock $@
|
||||
run-task basic_tests/tile_organization/fabric_tile_perimeter_cb_pb_pin_fixup $@
|
||||
run-task basic_tests/tile_organization/fabric_tile_clkntwk_io_subtile $@
|
||||
run-task basic_tests/tile_organization/homo_fabric_tile_preconfig $@
|
||||
run-task basic_tests/tile_organization/homo_fabric_tile_2x2_preconfig $@
|
||||
|
@ -242,6 +243,7 @@ run-task basic_tests/clock_network/homo_2clock_2layer $@
|
|||
run-task basic_tests/clock_network/homo_2clock_2layer_disable_unused $@
|
||||
run-task basic_tests/clock_network/homo_2clock_2layer_disable_unused_tree $@
|
||||
run-task basic_tests/clock_network/homo_1clock_1reset_2layer $@
|
||||
run-task basic_tests/clock_network/homo_1clock_1reset_3layer_2entry $@
|
||||
run-task basic_tests/clock_network/homo_1clock_1reset_2layer_y_entry $@
|
||||
run-task basic_tests/clock_network/homo_1clock_1reset_2layer_on_lut $@
|
||||
run-task basic_tests/clock_network/homo_1clock_1reset_2layer_syntax $@
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
<clock_networks default_segment="L1" default_tap_switch="ipin_cblock" default_driver_switch="0">
|
||||
<clock_network name="clk_tree_2lvl" global_port="op_clk[0:0]">
|
||||
<spine name="clk_spine_lvl0_botm0" start_x="1" start_y="1" end_x="1" end_y="2">
|
||||
<switch_point tap="clk_spine_lvl1_right" x="1" y="2"/>
|
||||
</spine>
|
||||
<spine name="clk_spine_lvl0_botm1" start_x="2" start_y="1" end_x="2" end_y="2">
|
||||
<switch_point tap="clk_spine_lvl1_left" x="2" y="2"/>
|
||||
</spine>
|
||||
<spine name="clk_spine_lvl1_left" start_x="2" start_y="2" end_x="1" end_y="2">
|
||||
<switch_point tap="clk_rib_lvl2_x0y2_upper" x="0" y="2"/>
|
||||
<switch_point tap="clk_rib_lvl2_x0y2_lower" x="0" y="2"/>
|
||||
<switch_point tap="clk_rib_lvl2_x1y2_upper" x="1" y="2"/>
|
||||
<switch_point tap="clk_rib_lvl2_x1y2_lower" x="1" y="2"/>
|
||||
</spine>
|
||||
<spine name="clk_spine_lvl1_right" start_x="2" start_y="2" end_x="4" end_y="2">
|
||||
<switch_point tap="clk_rib_lvl2_x2y2_upper" x="2" y="2"/>
|
||||
<switch_point tap="clk_rib_lvl2_x2y2_lower" x="2" y="2"/>
|
||||
<switch_point tap="clk_rib_lvl2_x3y2_upper" x="3" y="2"/>
|
||||
<switch_point tap="clk_rib_lvl2_x3y2_lower" x="3" y="2"/>
|
||||
<switch_point tap="clk_rib_lvl2_x4y2_upper" x="4" y="2"/>
|
||||
<switch_point tap="clk_rib_lvl2_x4y2_lower" x="4" y="2"/>
|
||||
</spine>
|
||||
<spine name="clk_rib_lvl2_x0y2_upper" start_x="0" start_y="3" end_x="0" end_y="4"/>
|
||||
<spine name="clk_rib_lvl2_x0y2_lower" start_x="0" start_y="2" end_x="0" end_y="1"/>
|
||||
<spine name="clk_rib_lvl2_x1y2_upper" start_x="1" start_y="3" end_x="1" end_y="4"/>
|
||||
<spine name="clk_rib_lvl2_x1y2_lower" start_x="1" start_y="2" end_x="1" end_y="1"/>
|
||||
<spine name="clk_rib_lvl2_x2y2_upper" start_x="2" start_y="3" end_x="2" end_y="4"/>
|
||||
<spine name="clk_rib_lvl2_x2y2_lower" start_x="2" start_y="2" end_x="2" end_y="1"/>
|
||||
<spine name="clk_rib_lvl2_x3y2_upper" start_x="3" start_y="3" end_x="3" end_y="4"/>
|
||||
<spine name="clk_rib_lvl2_x3y2_lower" start_x="3" start_y="2" end_x="3" end_y="1"/>
|
||||
<spine name="clk_rib_lvl2_x4y2_upper" start_x="4" start_y="3" end_x="4" end_y="4"/>
|
||||
<spine name="clk_rib_lvl2_x4y2_lower" start_x="4" start_y="2" end_x="4" end_y="1"/>
|
||||
<taps>
|
||||
<all from_pin="op_clk[0:0]" to_pin="clb[0:0].clk[0:0]"/>
|
||||
</taps>
|
||||
</clock_network>
|
||||
<clock_network name="rst_tree_2lvl" global_port="op_reset[0:0]">
|
||||
<spine name="rst_spine_lvl0_botm0" start_x="1" start_y="1" end_x="1" end_y="2">
|
||||
<switch_point tap="rst_spine_lvl1_right" x="1" y="2"/>
|
||||
</spine>
|
||||
<spine name="rst_spine_lvl0_botm1" start_x="2" start_y="1" end_x="2" end_y="2">
|
||||
<switch_point tap="rst_spine_lvl1_left" x="2" y="2"/>
|
||||
</spine>
|
||||
<spine name="rst_spine_lvl1_left" start_x="2" start_y="2" end_x="1" end_y="2">
|
||||
<switch_point tap="rst_rib_lvl2_x0y2_upper" x="0" y="2"/>
|
||||
<switch_point tap="rst_rib_lvl2_x0y2_lower" x="0" y="2"/>
|
||||
<switch_point tap="rst_rib_lvl2_x1y2_upper" x="1" y="2"/>
|
||||
<switch_point tap="rst_rib_lvl2_x1y2_lower" x="1" y="2"/>
|
||||
</spine>
|
||||
<spine name="rst_spine_lvl1_right" start_x="2" start_y="2" end_x="4" end_y="2">
|
||||
<switch_point tap="rst_rib_lvl2_x2y2_upper" x="2" y="2"/>
|
||||
<switch_point tap="rst_rib_lvl2_x2y2_lower" x="2" y="2"/>
|
||||
<switch_point tap="rst_rib_lvl2_x3y2_upper" x="3" y="2"/>
|
||||
<switch_point tap="rst_rib_lvl2_x3y2_lower" x="3" y="2"/>
|
||||
<switch_point tap="rst_rib_lvl2_x4y2_upper" x="4" y="2"/>
|
||||
<switch_point tap="rst_rib_lvl2_x4y2_lower" x="4" y="2"/>
|
||||
</spine>
|
||||
<spine name="rst_rib_lvl2_x0y2_upper" start_x="0" start_y="3" end_x="0" end_y="4"/>
|
||||
<spine name="rst_rib_lvl2_x0y2_lower" start_x="0" start_y="2" end_x="0" end_y="1"/>
|
||||
<spine name="rst_rib_lvl2_x1y2_upper" start_x="1" start_y="3" end_x="1" end_y="4"/>
|
||||
<spine name="rst_rib_lvl2_x1y2_lower" start_x="1" start_y="2" end_x="1" end_y="1"/>
|
||||
<spine name="rst_rib_lvl2_x2y2_upper" start_x="2" start_y="3" end_x="2" end_y="4"/>
|
||||
<spine name="rst_rib_lvl2_x2y2_lower" start_x="2" start_y="2" end_x="2" end_y="1"/>
|
||||
<spine name="rst_rib_lvl2_x3y2_upper" start_x="3" start_y="3" end_x="3" end_y="4"/>
|
||||
<spine name="rst_rib_lvl2_x3y2_lower" start_x="3" start_y="2" end_x="3" end_y="1"/>
|
||||
<spine name="rst_rib_lvl2_x4y2_upper" start_x="4" start_y="3" end_x="4" end_y="4"/>
|
||||
<spine name="rst_rib_lvl2_x4y2_lower" start_x="4" start_y="2" end_x="4" end_y="1"/>
|
||||
<taps>
|
||||
<all from_pin="op_reset[0:0]" to_pin="clb[0:0].reset[0:0]"/>
|
||||
</taps>
|
||||
</clock_network>
|
||||
</clock_networks>
|
|
@ -0,0 +1,8 @@
|
|||
<pin_constraints>
|
||||
<!-- For a given .blif file, we want to assign
|
||||
- the reset signal to the op_reset[0] port of the FPGA fabric
|
||||
-->
|
||||
<set_io pin="op_reset[0]" net="reset"/>
|
||||
<set_io pin="op_clk[0]" net="clk"/>
|
||||
</pin_constraints>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<pin_constraints>
|
||||
<!-- For a given .blif file, we want to assign
|
||||
- the reset signal to the op_reset[0] port of the FPGA fabric
|
||||
-->
|
||||
<set_io pin="op_reset[0]" net="resetb" default_value="1"/>
|
||||
<set_io pin="op_clk[0]" net="clk"/>
|
||||
</pin_constraints>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<repack_design_constraints>
|
||||
<!-- Intended to be dummy -->
|
||||
</repack_design_constraints>
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
|
||||
# Configuration file for running experiments
|
||||
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
|
||||
# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs
|
||||
# Each job execute fpga_flow script on combination of architecture & benchmark
|
||||
# timeout_each_job is timeout for each job
|
||||
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
|
||||
|
||||
[GENERAL]
|
||||
run_engine=openfpga_shell
|
||||
power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml
|
||||
power_analysis = false
|
||||
spice_output=false
|
||||
verilog_output=true
|
||||
timeout_each_job = 3*60
|
||||
fpga_flow=yosys_vpr
|
||||
|
||||
[OpenFPGA_SHELL]
|
||||
openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_shell_scripts/example_clkntwk_no_ace_script.openfpga
|
||||
openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_frac_N4_fracff_40nm_Ntwk1clk1rst2lvl_cc_openfpga.xml
|
||||
openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/fixed_sim_openfpga.xml
|
||||
openfpga_repack_constraints_file=${PATH:TASK_DIR}/config/repack_pin_constraints.xml
|
||||
openfpga_vpr_device_layout=4x4
|
||||
openfpga_vpr_route_chan_width=32
|
||||
openfpga_clock_arch_file=${PATH:TASK_DIR}/config/clk_arch_1clk_1rst_3layer.xml
|
||||
openfpga_verilog_testbench_port_mapping=--explicit_port_mapping
|
||||
openfpga_route_clock_options=
|
||||
|
||||
[ARCHITECTURES]
|
||||
arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/vpr_arch/k4_frac_N4_tileable_fracff_40nm.xml
|
||||
|
||||
[BENCHMARKS]
|
||||
bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/counters/counter_8bit_async_reset/counter.v
|
||||
bench1=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/counters/counter_8bit_async_resetb/counter.v
|
||||
|
||||
[SYNTHESIS_PARAM]
|
||||
# Yosys script parameters
|
||||
bench_yosys_cell_sim_verilog_common=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_yosys_techlib/openfpga_dff_sim.v
|
||||
bench_yosys_dff_map_verilog_common=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_yosys_techlib/openfpga_dff_map.v
|
||||
bench_read_verilog_options_common = -nolatches
|
||||
bench_yosys_common=${PATH:OPENFPGA_PATH}/openfpga_flow/misc/ys_tmpl_yosys_vpr_dff_flow.ys
|
||||
bench_yosys_rewrite_common=${PATH:OPENFPGA_PATH}/openfpga_flow/misc/ys_tmpl_yosys_vpr_flow_with_rewrite.ys;${PATH:OPENFPGA_PATH}/openfpga_flow/misc/ys_tmpl_rewrite_flow.ys
|
||||
|
||||
bench0_top = counter
|
||||
bench0_openfpga_pin_constraints_file = ${PATH:TASK_DIR}/config/pin_constraints_reset.xml
|
||||
bench0_openfpga_verilog_testbench_port_mapping=
|
||||
|
||||
bench1_top = counter
|
||||
bench1_openfpga_pin_constraints_file = ${PATH:TASK_DIR}/config/pin_constraints_resetb.xml
|
||||
bench1_openfpga_verilog_testbench_port_mapping=
|
||||
|
||||
[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH]
|
||||
end_flow_with_test=
|
||||
vpr_fpga_verilog_formal_verification_top_netlist=
|
|
@ -0,0 +1,41 @@
|
|||
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
|
||||
# Configuration file for running experiments
|
||||
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
|
||||
# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs
|
||||
# Each job execute fpga_flow script on combination of architecture & benchmark
|
||||
# timeout_each_job is timeout for each job
|
||||
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
|
||||
|
||||
[GENERAL]
|
||||
run_engine=openfpga_shell
|
||||
power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml
|
||||
power_analysis = false
|
||||
spice_output=false
|
||||
verilog_output=true
|
||||
timeout_each_job = 20*60
|
||||
fpga_flow=yosys_vpr
|
||||
|
||||
[OpenFPGA_SHELL]
|
||||
openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_shell_scripts/group_tile_preconfig_testbench_example_script.openfpga
|
||||
openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_GlobalTileClk_PerimeterCb_registerable_io_cc_openfpga.xml
|
||||
openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/fixed_sim_openfpga.xml
|
||||
openfpga_vpr_extra_options=--skip_sync_clustering_and_routing_results on
|
||||
openfpga_pb_pin_fixup_command=pb_pin_fixup --verbose
|
||||
openfpga_vpr_device=2x2
|
||||
openfpga_vpr_route_chan_width=20
|
||||
openfpga_group_tile_config_file=${PATH:TASK_DIR}/config/tile_config.xml
|
||||
openfpga_verilog_testbench_options=--explicit_port_mapping
|
||||
|
||||
[ARCHITECTURES]
|
||||
arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/vpr_arch/k4_N4_tileable_PerimeterCb_ClkNtwk_registerable_io_40nm.xml
|
||||
|
||||
[BENCHMARKS]
|
||||
bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2_pipelined/and2_pipelined.v
|
||||
|
||||
[SYNTHESIS_PARAM]
|
||||
bench_read_verilog_options_common = -nolatches
|
||||
bench0_top = and2_pipelined
|
||||
|
||||
[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH]
|
||||
end_flow_with_test=
|
||||
vpr_fpga_verilog_formal_verification_top_netlist=
|
|
@ -0,0 +1 @@
|
|||
<tiles style="top_left"/>
|
Loading…
Reference in New Issue