From 48c0b4b219c0e6d8f06d963a8aa8756f8de84268 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 12:45:12 -0700 Subject: [PATCH 01/19] [core] fixed a bug where net name is not shown correctly on wire LUTs --- openfpga/src/repack/build_physical_truth_table.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/openfpga/src/repack/build_physical_truth_table.cpp b/openfpga/src/repack/build_physical_truth_table.cpp index 86a2c7aa4..f336cbc54 100644 --- a/openfpga/src/repack/build_physical_truth_table.cpp +++ b/openfpga/src/repack/build_physical_truth_table.cpp @@ -138,8 +138,13 @@ static void build_physical_pb_lut_truth_tables( size_t(lut_pb_id), output_pin->to_string().c_str()); VTR_LOGV(verbose, "Input nets:\n"); for (auto input_net : input_nets) { - VTR_LOGV(verbose, "\t%s\n", - atom_ctx.nlist.net_name(input_net).c_str()); + if (AtomNetId::INVALID() == input_net) { + VTR_LOGV(verbose, "unconn "); + } else { + VTR_ASSERT(AtomNetId::INVALID() != input_net); + VTR_LOGV(verbose, "\t%s\n", + atom_ctx.nlist.net_name(input_net).c_str()); + } } VTR_LOGV(verbose, "Output nets:\n"); VTR_LOGV(verbose, "\t%s\n", From 3a14a59a8e3bbf13d909e6f6451ccff8f77b1288 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 12:46:28 -0700 Subject: [PATCH 02/19] [ci] now reg tests are only run on PR for main branch --- .github/workflows/build.yml | 1 - .github/workflows/cell_lib_test.yml | 1 - .github/workflows/format.yaml | 1 - 3 files changed, 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 83cfed09b..34c17b7f3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,7 +3,6 @@ name: Test # Run CI on push, PR, and weekly. on: - push: pull_request: schedule: - cron: "0 0 * * 0 " # weekly diff --git a/.github/workflows/cell_lib_test.yml b/.github/workflows/cell_lib_test.yml index 7d5b08984..3a472af3a 100644 --- a/.github/workflows/cell_lib_test.yml +++ b/.github/workflows/cell_lib_test.yml @@ -3,7 +3,6 @@ name: Cell Library Tests # Run CI on push, PR, and weekly. on: - push: pull_request: schedule: - cron: "0 0 * * 0 " # weekly diff --git a/.github/workflows/format.yaml b/.github/workflows/format.yaml index 273c1122c..e4c84320e 100644 --- a/.github/workflows/format.yaml +++ b/.github/workflows/format.yaml @@ -3,7 +3,6 @@ name: Code Format # Run CI on push, PR, and weekly. on: - push: pull_request: schedule: - cron: "0 0 * * 0 " # weekly From edb50f1b4de7b1d52005047f3e2211302ba0f1a0 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 14:37:46 -0700 Subject: [PATCH 03/19] [core] update debug messages --- openfpga/src/repack/build_physical_truth_table.cpp | 2 +- openfpga/src/repack/lb_router_utils.cpp | 5 ++--- openfpga/src/utils/physical_pb_utils.cpp | 5 ++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/openfpga/src/repack/build_physical_truth_table.cpp b/openfpga/src/repack/build_physical_truth_table.cpp index f336cbc54..66141bc99 100644 --- a/openfpga/src/repack/build_physical_truth_table.cpp +++ b/openfpga/src/repack/build_physical_truth_table.cpp @@ -139,7 +139,7 @@ static void build_physical_pb_lut_truth_tables( VTR_LOGV(verbose, "Input nets:\n"); for (auto input_net : input_nets) { if (AtomNetId::INVALID() == input_net) { - VTR_LOGV(verbose, "unconn "); + VTR_LOGV(verbose, "\tunconn\n"); } else { VTR_ASSERT(AtomNetId::INVALID() != input_net); VTR_LOGV(verbose, "\t%s\n", diff --git a/openfpga/src/repack/lb_router_utils.cpp b/openfpga/src/repack/lb_router_utils.cpp index 45b1fce24..25c4399eb 100644 --- a/openfpga/src/repack/lb_router_utils.cpp +++ b/openfpga/src/repack/lb_router_utils.cpp @@ -92,10 +92,9 @@ void save_lb_router_results_to_physical_pb(PhysicalPb& phy_pb, const AtomNetId& atom_net = lb_router.net_atom_net_id(net); /* Print info to help debug */ - VTR_LOGV(verbose, "Save net '%s' to physical pb_graph_pin '%s.%s[%d]'\n", + VTR_LOGV(verbose, "Save net '%s' to physical pb_graph_pin '%s'\n", atom_netlist.net_name(atom_net).c_str(), - pb_graph_pin->parent_node->pb_type->name, - pb_graph_pin->port->name, pb_graph_pin->pin_number); + pb_graph_pin->to_string().c_str()); if (AtomNetId::INVALID() == phy_pb.pb_graph_pin_atom_net(pb_id, pb_graph_pin)) { diff --git a/openfpga/src/utils/physical_pb_utils.cpp b/openfpga/src/utils/physical_pb_utils.cpp index 12d5572e3..7114ef37b 100644 --- a/openfpga/src/utils/physical_pb_utils.cpp +++ b/openfpga/src/utils/physical_pb_utils.cpp @@ -281,9 +281,8 @@ static void mark_physical_pb_wired_lut_outputs( /* Print debug info */ VTR_LOGV( - verbose, "Mark physical pb_graph pin '%s.%s[%d]' as wire LUT output\n", - physical_pb_graph_pin->parent_node->pb_type->name, - physical_pb_graph_pin->port->name, physical_pb_graph_pin->pin_number); + verbose, "Mark physical pb_graph pin '%s' as wire LUT output\n", + physical_pb_graph_pin->to_string().c_str()); /* Label the pins in physical_pb as driven by wired LUT*/ phy_pb.set_wire_lut_output(primitive_pb, physical_pb_graph_pin, true); From 7a7fc679a87d1bcd57f5f5888370f0a99d80b0b7 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 14:52:59 -0700 Subject: [PATCH 04/19] [core] enable more debugging message in repacker --- openfpga/src/utils/physical_pb_utils.cpp | 27 +++++++++++------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/openfpga/src/utils/physical_pb_utils.cpp b/openfpga/src/utils/physical_pb_utils.cpp index 7114ef37b..99f0374f9 100644 --- a/openfpga/src/utils/physical_pb_utils.cpp +++ b/openfpga/src/utils/physical_pb_utils.cpp @@ -131,7 +131,7 @@ void alloc_physical_pb_from_pb_graph( static void update_primitive_physical_pb_pin_atom_net( PhysicalPb& phy_pb, const PhysicalPbId& primitive_pb, const t_pb_graph_pin* pb_graph_pin, const t_pb_routes& pb_route, - const VprDeviceAnnotation& device_annotation) { + const VprDeviceAnnotation& device_annotation, const AtomNetlist& atom_nlist, const bool& verbose) { int node_index = pb_graph_pin->pin_count_in_cluster; if (pb_route.count(node_index)) { /* The pin is mapped to a net, find the original pin in the atom netlist */ @@ -144,15 +144,12 @@ static void update_primitive_physical_pb_pin_atom_net( device_annotation.physical_pb_graph_pin(pb_graph_pin); VTR_ASSERT(nullptr != physical_pb_graph_pin); - /* Print info to help debug - bool verbose = true; - VTR_LOGV(verbose, - "\nSynchronize net '%lu' to physical pb_graph_pin '%s.%s[%d]'\n", - size_t(atom_net), - pb_graph_pin->parent_node->pb_type->name, - pb_graph_pin->port->name, - pb_graph_pin->pin_number); - */ + if (AtomNetId::INVALID() != atom_net) { + VTR_LOGV(verbose, + "Synchronize net '%s' to physical pb_graph_pin '%s'\n", + atom_nlist.net_name(atom_net).c_str(), + pb_graph_pin->to_string().c_str()); + } /* Check if the pin has been mapped to a net. * If yes, the atom net must be the same @@ -175,7 +172,7 @@ static void synchronize_primitive_physical_pb_atom_nets( PhysicalPb& phy_pb, const PhysicalPbId& primitive_pb, const t_pb_graph_node* pb_graph_node, const t_pb_routes& pb_route, const AtomContext& atom_ctx, const AtomBlockId& atom_blk, - const VprDeviceAnnotation& device_annotation) { + const VprDeviceAnnotation& device_annotation, const bool& verbose) { /* Iterate over all the ports: input, output and clock */ for (int iport = 0; iport < pb_graph_node->num_input_ports; ++iport) { @@ -199,7 +196,7 @@ static void synchronize_primitive_physical_pb_atom_nets( */ update_primitive_physical_pb_pin_atom_net( phy_pb, primitive_pb, &(pb_graph_node->input_pins[iport][ipin]), - pb_route, device_annotation); + pb_route, device_annotation, atom_ctx.nlist, verbose); } } @@ -224,7 +221,7 @@ static void synchronize_primitive_physical_pb_atom_nets( */ update_primitive_physical_pb_pin_atom_net( phy_pb, primitive_pb, &(pb_graph_node->output_pins[iport][ipin]), - pb_route, device_annotation); + pb_route, device_annotation, atom_ctx.nlist, verbose); } } @@ -249,7 +246,7 @@ static void synchronize_primitive_physical_pb_atom_nets( */ update_primitive_physical_pb_pin_atom_net( phy_pb, primitive_pb, &(pb_graph_node->clock_pins[iport][ipin]), - pb_route, device_annotation); + pb_route, device_annotation, atom_ctx.nlist, verbose); } } } @@ -399,7 +396,7 @@ void rec_update_physical_pb_from_operating_pb( /* Iterate over ports and annotate the atom pins */ synchronize_primitive_physical_pb_atom_nets( phy_pb, physical_pb, pb_graph_node, pb_route, atom_ctx, atom_blk, - device_annotation); + device_annotation, verbose); return; } From 937e279c593861c12e4bab0633ce754f3230f8ee Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 15:43:51 -0700 Subject: [PATCH 05/19] [core] adding more debugging messages --- openfpga/src/utils/physical_pb_utils.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openfpga/src/utils/physical_pb_utils.cpp b/openfpga/src/utils/physical_pb_utils.cpp index 99f0374f9..79e1f8b59 100644 --- a/openfpga/src/utils/physical_pb_utils.cpp +++ b/openfpga/src/utils/physical_pb_utils.cpp @@ -314,6 +314,9 @@ void rec_update_physical_pb_from_operating_pb( VTR_ASSERT(atom_blk); phy_pb.add_atom_block(physical_pb, atom_blk); + VTR_LOGV(verbose, "Update physical pb '%s' using atom block '%s'\n", + physical_pb_graph_node->hierarchical_type_name().c_str(), + atom_ctx.nlist.block_name(atom_blk).c_str()); /* if the operating pb type has bitstream annotation, * bind the bitstream value from atom block to the physical pb From a9ccc277bd58d75428963394130f00e85f813ed9 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 15:49:34 -0700 Subject: [PATCH 06/19] [core] more debugging message --- openfpga/src/utils/physical_pb_utils.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openfpga/src/utils/physical_pb_utils.cpp b/openfpga/src/utils/physical_pb_utils.cpp index 79e1f8b59..9661afb16 100644 --- a/openfpga/src/utils/physical_pb_utils.cpp +++ b/openfpga/src/utils/physical_pb_utils.cpp @@ -162,6 +162,9 @@ static void update_primitive_physical_pb_pin_atom_net( VTR_ASSERT(atom_net == phy_pb.pb_graph_pin_atom_net( primitive_pb, physical_pb_graph_pin)); } + } else { + VTR_LOGV("Skip as no valid routing traces if found on physical pb_graph_pin '%s'\n", + pb_graph_pin->to_string().c_str()); } } From 5adc1be204e45b614d2a5c5ddd955c7257d138ed Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 15:50:27 -0700 Subject: [PATCH 07/19] [core] syntax --- openfpga/src/utils/physical_pb_utils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfpga/src/utils/physical_pb_utils.cpp b/openfpga/src/utils/physical_pb_utils.cpp index 9661afb16..1298706b9 100644 --- a/openfpga/src/utils/physical_pb_utils.cpp +++ b/openfpga/src/utils/physical_pb_utils.cpp @@ -163,7 +163,7 @@ static void update_primitive_physical_pb_pin_atom_net( primitive_pb, physical_pb_graph_pin)); } } else { - VTR_LOGV("Skip as no valid routing traces if found on physical pb_graph_pin '%s'\n", + VTR_LOGV(verbose, "Skip as no valid routing traces if found on physical pb_graph_pin '%s'\n", pb_graph_pin->to_string().c_str()); } } From 5b35f567d2dbe18cc0f1ab00ad91fa9637de8557 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 16:00:10 -0700 Subject: [PATCH 08/19] [core] detailed messages to trace why some nets are no sync --- openfpga/src/utils/physical_pb_utils.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/openfpga/src/utils/physical_pb_utils.cpp b/openfpga/src/utils/physical_pb_utils.cpp index 1298706b9..c483a9eeb 100644 --- a/openfpga/src/utils/physical_pb_utils.cpp +++ b/openfpga/src/utils/physical_pb_utils.cpp @@ -177,20 +177,26 @@ static void synchronize_primitive_physical_pb_atom_nets( const AtomContext& atom_ctx, const AtomBlockId& atom_blk, const VprDeviceAnnotation& device_annotation, const bool& verbose) { /* Iterate over all the ports: input, output and clock */ + VTR_LOGV(verbose, "Synchronizing atom nets on pb_graph_node '%s'...\n", + pb_graph_node->hierarchical_type_name().c_str()); for (int iport = 0; iport < pb_graph_node->num_input_ports; ++iport) { for (int ipin = 0; ipin < pb_graph_node->num_input_pins[iport]; ++ipin) { /* Port exists (some LUTs may have no input and hence no port in the atom * netlist) */ + VTR_LOGV(verbose, "Synchronizing atom nets on pb_graph_pin '%s'...\n", + pb_graph_node->input_pins[iport][ipin].to_string().c_str()); t_model_ports* model_port = pb_graph_node->input_pins[iport][ipin].port->model_port; if (nullptr == model_port) { + VTR_LOGV(verbose, "Skip due to empty model port\n"); continue; } AtomPortId atom_port = atom_ctx.nlist.find_atom_port(atom_blk, model_port); if (!atom_port) { + VTR_LOGV(verbose, "Skip due to invalid port\n"); continue; } /* Find the atom nets mapped to the pin @@ -207,15 +213,19 @@ static void synchronize_primitive_physical_pb_atom_nets( for (int ipin = 0; ipin < pb_graph_node->num_output_pins[iport]; ++ipin) { /* Port exists (some LUTs may have no input and hence no port in the atom * netlist) */ + VTR_LOGV(verbose, "Synchronizing atom nets on pb_graph_pin '%s'...\n", + pb_graph_node->output_pins[iport][ipin].to_string().c_str()); t_model_ports* model_port = pb_graph_node->output_pins[iport][ipin].port->model_port; if (nullptr == model_port) { + VTR_LOGV(verbose, "Skip due to empty model port\n"); continue; } AtomPortId atom_port = atom_ctx.nlist.find_atom_port(atom_blk, model_port); if (!atom_port) { + VTR_LOGV(verbose, "Skip due to invalid port\n"); continue; } /* Find the atom nets mapped to the pin @@ -232,15 +242,19 @@ static void synchronize_primitive_physical_pb_atom_nets( for (int ipin = 0; ipin < pb_graph_node->num_clock_pins[iport]; ++ipin) { /* Port exists (some LUTs may have no input and hence no port in the atom * netlist) */ + VTR_LOGV(verbose, "Synchronizing atom nets on pb_graph_pin '%s'...\n", + pb_graph_node->clock_pins[iport][ipin].to_string().c_str()); t_model_ports* model_port = pb_graph_node->clock_pins[iport][ipin].port->model_port; if (nullptr == model_port) { + VTR_LOGV(verbose, "Skip due to empty model port\n"); continue; } AtomPortId atom_port = atom_ctx.nlist.find_atom_port(atom_blk, model_port); if (!atom_port) { + VTR_LOGV(verbose, "Skip due to invalid port\n"); continue; } /* Find the atom nets mapped to the pin From 6dc31bf892965d30d4cb01d0c3a563ad47a6ed86 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 16:53:59 -0700 Subject: [PATCH 09/19] [core] fixed a bug on missing net sync up during repack --- openfpga/src/utils/physical_pb_utils.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/openfpga/src/utils/physical_pb_utils.cpp b/openfpga/src/utils/physical_pb_utils.cpp index c483a9eeb..16ee5068b 100644 --- a/openfpga/src/utils/physical_pb_utils.cpp +++ b/openfpga/src/utils/physical_pb_utils.cpp @@ -188,6 +188,12 @@ static void synchronize_primitive_physical_pb_atom_nets( pb_graph_node->input_pins[iport][ipin].to_string().c_str()); t_model_ports* model_port = pb_graph_node->input_pins[iport][ipin].port->model_port; + /* Special for LUTs, the model port is hidden under 1 level */ + if (LUT_CLASS == pb_graph_node->pb_type->class_type) { + VTR_ASSERT(pb_graph_node->pb_type->num_modes == 2); + model_port = pb_graph_node->child_pb_graph_nodes[1][0][0].input_pins[iport][ipin].port->model_port; + } + /* It seems that LUT port are no longer built with an internal model */ if (nullptr == model_port) { VTR_LOGV(verbose, "Skip due to empty model port\n"); continue; @@ -217,6 +223,11 @@ static void synchronize_primitive_physical_pb_atom_nets( pb_graph_node->output_pins[iport][ipin].to_string().c_str()); t_model_ports* model_port = pb_graph_node->output_pins[iport][ipin].port->model_port; + /* Special for LUTs, the model port is hidden under 1 level */ + if (LUT_CLASS == pb_graph_node->pb_type->class_type) { + VTR_ASSERT(pb_graph_node->pb_type->num_modes == 2); + model_port = pb_graph_node->child_pb_graph_nodes[1][0][0].output_pins[iport][ipin].port->model_port; + } if (nullptr == model_port) { VTR_LOGV(verbose, "Skip due to empty model port\n"); continue; From c565264e7d05c93d5508416f818c0bc7556486fe Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 17:14:42 -0700 Subject: [PATCH 10/19] [core] more debuggin messages --- openfpga/src/repack/build_physical_truth_table.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openfpga/src/repack/build_physical_truth_table.cpp b/openfpga/src/repack/build_physical_truth_table.cpp index 66141bc99..dbffbdee5 100644 --- a/openfpga/src/repack/build_physical_truth_table.cpp +++ b/openfpga/src/repack/build_physical_truth_table.cpp @@ -241,6 +241,8 @@ void build_physical_lut_truth_tables( for (auto blk_id : cluster_ctx.clb_nlist.blocks()) { PhysicalPb& physical_pb = cluster_annotation.mutable_physical_pb(blk_id); + VTR_LOGV(verbose, "Build truth tables for physical LUTs under clustered block '%s'...\n", + cluster_ctx.clb_nlist.block_name(blk_id).c_str()); /* Find the LUT physical pb id */ for (const PhysicalPbId& primitive_pb : physical_pb.primitive_pbs()) { CircuitModelId circuit_model = device_annotation.pb_type_circuit_model( From 348d474bfd4421a1d70ed5ec66c15f4117c3ae53 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 17:40:19 -0700 Subject: [PATCH 11/19] [core] more debuggin messages --- openfpga/src/repack/repack.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/openfpga/src/repack/repack.cpp b/openfpga/src/repack/repack.cpp index 35f45d7a1..2217c494f 100644 --- a/openfpga/src/repack/repack.cpp +++ b/openfpga/src/repack/repack.cpp @@ -643,6 +643,7 @@ static void add_lb_router_nets( if ((ignored_atom_nets[atom_net_id]) && (options.is_pin_ignore_global_nets(std::string(lb_type->pb_type->name), curr_pin))) { + VTR_LOGV("Skip net '%s' as it is global and set to be ignored\n", atom_ctx.nlist.net_name(atom_net_id).c_str()); continue; } From 212abecc277524c06a36b9c9d0b06539e1764462 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 17:41:49 -0700 Subject: [PATCH 12/19] [core] syntax --- openfpga/src/repack/repack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openfpga/src/repack/repack.cpp b/openfpga/src/repack/repack.cpp index 2217c494f..0d3ad48fc 100644 --- a/openfpga/src/repack/repack.cpp +++ b/openfpga/src/repack/repack.cpp @@ -643,7 +643,7 @@ static void add_lb_router_nets( if ((ignored_atom_nets[atom_net_id]) && (options.is_pin_ignore_global_nets(std::string(lb_type->pb_type->name), curr_pin))) { - VTR_LOGV("Skip net '%s' as it is global and set to be ignored\n", atom_ctx.nlist.net_name(atom_net_id).c_str()); + VTR_LOGV(verbose, "Skip net '%s' as it is global and set to be ignored\n", atom_ctx.nlist.net_name(atom_net_id).c_str()); continue; } From f9cd01636d004b6dfc91f9a67aa8cf088cc29564 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 17:57:36 -0700 Subject: [PATCH 13/19] [core] fixed the bug where there is only 1 routing trace for a net which should be ignored (due to treated as global). This net should not be ignored unless there are >1 routing traces on the top-level pb. Then we can merge one. --- openfpga/src/repack/repack.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/openfpga/src/repack/repack.cpp b/openfpga/src/repack/repack.cpp index 0d3ad48fc..c12e3a596 100644 --- a/openfpga/src/repack/repack.cpp +++ b/openfpga/src/repack/repack.cpp @@ -304,6 +304,33 @@ static std::vector find_pb_route_by_atom_net( return pb_route_indices; } +/*************************************************************************************** + * This function will find the actual routing traces of the demanded net + * There is a specific search space applied when searching the routing traces: + * - ONLY applicable to the pb_pin of top-level pb_graph_node + ***************************************************************************************/ +static std::vector find_pb_routes_by_atom_net_among_top_pb_pins( + const t_pb* pb, const AtomNetId& atom_net_id) { + std::vector pb_route_indices; + + std::vector candidate_pool; + for (int pin = 0; pin < pb->pb_graph_node->total_pb_pins; ++pin) { + /* Bypass unused pins */ + if ((0 == pb->pb_route.count(pin)) || + (AtomNetId::INVALID() == pb->pb_route.at(pin).atom_net_id)) { + continue; + } + /* Get the driver pb pin id, it must be valid */ + if (atom_net_id != pb->pb_route.at(pin).atom_net_id) { + continue; + } + if (pb->pb_route.at(pin).pb_graph_pin->parent_node->is_root()) { + candidate_pool.push_back(pin); + } + } + return candidate_pool; +} + /*************************************************************************************** * This function will find the actual routing traces of the demanded net * There is a specific search space applied when searching the routing traces: @@ -584,7 +611,6 @@ static void add_lb_router_nets( std::string(lb_type->pb_type->name), curr_pin))) { /* Find the net mapped to this pin in clustering results*/ AtomNetId atom_net_id = pb_pin_mapped_nets[source_pb_pin]; - std::vector pb_route_indices = find_pb_route_by_atom_net(pb, source_pb_pin, atom_net_id); VTR_ASSERT(1 == pb_route_indices.size()); @@ -641,6 +667,7 @@ static void add_lb_router_nets( BasicPort curr_pin(std::string(source_pb_pin->port->name), source_pb_pin->pin_number, source_pb_pin->pin_number); if ((ignored_atom_nets[atom_net_id]) && + (find_pb_routes_by_atom_net_among_top_pb_pins(pb, atom_net_id).size() > 1) && (options.is_pin_ignore_global_nets(std::string(lb_type->pb_type->name), curr_pin))) { VTR_LOGV(verbose, "Skip net '%s' as it is global and set to be ignored\n", atom_ctx.nlist.net_name(atom_net_id).c_str()); From 2d10be9edb8113d07101016512aba6512e7a9564 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 18:00:24 -0700 Subject: [PATCH 14/19] [core] code comments --- openfpga/src/repack/repack.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/openfpga/src/repack/repack.cpp b/openfpga/src/repack/repack.cpp index c12e3a596..c86f8bb53 100644 --- a/openfpga/src/repack/repack.cpp +++ b/openfpga/src/repack/repack.cpp @@ -666,6 +666,7 @@ static void add_lb_router_nets( BasicPort curr_pin(std::string(source_pb_pin->port->name), source_pb_pin->pin_number, source_pb_pin->pin_number); + /* Be very careful! There is only one routing trace for the net, it should never be ignored! */ if ((ignored_atom_nets[atom_net_id]) && (find_pb_routes_by_atom_net_among_top_pb_pins(pb, atom_net_id).size() > 1) && (options.is_pin_ignore_global_nets(std::string(lb_type->pb_type->name), From 514ec2f02ee40d7a5c33f1720dd6ad0e67e92788 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 18:02:46 -0700 Subject: [PATCH 15/19] [core] code format --- .../src/repack/build_physical_truth_table.cpp | 6 +++-- openfpga/src/repack/repack.cpp | 9 ++++--- openfpga/src/utils/physical_pb_utils.cpp | 27 +++++++++++-------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/openfpga/src/repack/build_physical_truth_table.cpp b/openfpga/src/repack/build_physical_truth_table.cpp index dbffbdee5..67f258c34 100644 --- a/openfpga/src/repack/build_physical_truth_table.cpp +++ b/openfpga/src/repack/build_physical_truth_table.cpp @@ -241,8 +241,10 @@ void build_physical_lut_truth_tables( for (auto blk_id : cluster_ctx.clb_nlist.blocks()) { PhysicalPb& physical_pb = cluster_annotation.mutable_physical_pb(blk_id); - VTR_LOGV(verbose, "Build truth tables for physical LUTs under clustered block '%s'...\n", - cluster_ctx.clb_nlist.block_name(blk_id).c_str()); + VTR_LOGV( + verbose, + "Build truth tables for physical LUTs under clustered block '%s'...\n", + cluster_ctx.clb_nlist.block_name(blk_id).c_str()); /* Find the LUT physical pb id */ for (const PhysicalPbId& primitive_pb : physical_pb.primitive_pbs()) { CircuitModelId circuit_model = device_annotation.pb_type_circuit_model( diff --git a/openfpga/src/repack/repack.cpp b/openfpga/src/repack/repack.cpp index c86f8bb53..4f3dc460a 100644 --- a/openfpga/src/repack/repack.cpp +++ b/openfpga/src/repack/repack.cpp @@ -666,12 +666,15 @@ static void add_lb_router_nets( BasicPort curr_pin(std::string(source_pb_pin->port->name), source_pb_pin->pin_number, source_pb_pin->pin_number); - /* Be very careful! There is only one routing trace for the net, it should never be ignored! */ + /* Be very careful! There is only one routing trace for the net, it should + * never be ignored! */ if ((ignored_atom_nets[atom_net_id]) && - (find_pb_routes_by_atom_net_among_top_pb_pins(pb, atom_net_id).size() > 1) && + (find_pb_routes_by_atom_net_among_top_pb_pins(pb, atom_net_id).size() > + 1) && (options.is_pin_ignore_global_nets(std::string(lb_type->pb_type->name), curr_pin))) { - VTR_LOGV(verbose, "Skip net '%s' as it is global and set to be ignored\n", atom_ctx.nlist.net_name(atom_net_id).c_str()); + VTR_LOGV(verbose, "Skip net '%s' as it is global and set to be ignored\n", + atom_ctx.nlist.net_name(atom_net_id).c_str()); continue; } diff --git a/openfpga/src/utils/physical_pb_utils.cpp b/openfpga/src/utils/physical_pb_utils.cpp index 16ee5068b..150028815 100644 --- a/openfpga/src/utils/physical_pb_utils.cpp +++ b/openfpga/src/utils/physical_pb_utils.cpp @@ -131,7 +131,8 @@ void alloc_physical_pb_from_pb_graph( static void update_primitive_physical_pb_pin_atom_net( PhysicalPb& phy_pb, const PhysicalPbId& primitive_pb, const t_pb_graph_pin* pb_graph_pin, const t_pb_routes& pb_route, - const VprDeviceAnnotation& device_annotation, const AtomNetlist& atom_nlist, const bool& verbose) { + const VprDeviceAnnotation& device_annotation, const AtomNetlist& atom_nlist, + const bool& verbose) { int node_index = pb_graph_pin->pin_count_in_cluster; if (pb_route.count(node_index)) { /* The pin is mapped to a net, find the original pin in the atom netlist */ @@ -145,8 +146,7 @@ static void update_primitive_physical_pb_pin_atom_net( VTR_ASSERT(nullptr != physical_pb_graph_pin); if (AtomNetId::INVALID() != atom_net) { - VTR_LOGV(verbose, - "Synchronize net '%s' to physical pb_graph_pin '%s'\n", + VTR_LOGV(verbose, "Synchronize net '%s' to physical pb_graph_pin '%s'\n", atom_nlist.net_name(atom_net).c_str(), pb_graph_pin->to_string().c_str()); } @@ -163,7 +163,9 @@ static void update_primitive_physical_pb_pin_atom_net( primitive_pb, physical_pb_graph_pin)); } } else { - VTR_LOGV(verbose, "Skip as no valid routing traces if found on physical pb_graph_pin '%s'\n", + VTR_LOGV(verbose, + "Skip as no valid routing traces if found on physical " + "pb_graph_pin '%s'\n", pb_graph_pin->to_string().c_str()); } } @@ -191,9 +193,11 @@ static void synchronize_primitive_physical_pb_atom_nets( /* Special for LUTs, the model port is hidden under 1 level */ if (LUT_CLASS == pb_graph_node->pb_type->class_type) { VTR_ASSERT(pb_graph_node->pb_type->num_modes == 2); - model_port = pb_graph_node->child_pb_graph_nodes[1][0][0].input_pins[iport][ipin].port->model_port; + model_port = pb_graph_node->child_pb_graph_nodes[1][0][0] + .input_pins[iport][ipin] + .port->model_port; } - /* It seems that LUT port are no longer built with an internal model */ + /* It seems that LUT port are no longer built with an internal model */ if (nullptr == model_port) { VTR_LOGV(verbose, "Skip due to empty model port\n"); continue; @@ -226,7 +230,9 @@ static void synchronize_primitive_physical_pb_atom_nets( /* Special for LUTs, the model port is hidden under 1 level */ if (LUT_CLASS == pb_graph_node->pb_type->class_type) { VTR_ASSERT(pb_graph_node->pb_type->num_modes == 2); - model_port = pb_graph_node->child_pb_graph_nodes[1][0][0].output_pins[iport][ipin].port->model_port; + model_port = pb_graph_node->child_pb_graph_nodes[1][0][0] + .output_pins[iport][ipin] + .port->model_port; } if (nullptr == model_port) { VTR_LOGV(verbose, "Skip due to empty model port\n"); @@ -305,9 +311,8 @@ static void mark_physical_pb_wired_lut_outputs( VTR_ASSERT(nullptr != physical_pb_graph_pin); /* Print debug info */ - VTR_LOGV( - verbose, "Mark physical pb_graph pin '%s' as wire LUT output\n", - physical_pb_graph_pin->to_string().c_str()); + VTR_LOGV(verbose, "Mark physical pb_graph pin '%s' as wire LUT output\n", + physical_pb_graph_pin->to_string().c_str()); /* Label the pins in physical_pb as driven by wired LUT*/ phy_pb.set_wire_lut_output(primitive_pb, physical_pb_graph_pin, true); @@ -344,7 +349,7 @@ void rec_update_physical_pb_from_operating_pb( phy_pb.add_atom_block(physical_pb, atom_blk); VTR_LOGV(verbose, "Update physical pb '%s' using atom block '%s'\n", physical_pb_graph_node->hierarchical_type_name().c_str(), - atom_ctx.nlist.block_name(atom_blk).c_str()); + atom_ctx.nlist.block_name(atom_blk).c_str()); /* if the operating pb type has bitstream annotation, * bind the bitstream value from atom block to the physical pb From 93ebbef85185551eadb11807c041f7ee1b669f40 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 19:42:50 -0700 Subject: [PATCH 16/19] [core] fixed a bug --- openfpga/src/utils/physical_pb_utils.cpp | 26 +++++++++++++----------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/openfpga/src/utils/physical_pb_utils.cpp b/openfpga/src/utils/physical_pb_utils.cpp index 150028815..29a2164d2 100644 --- a/openfpga/src/utils/physical_pb_utils.cpp +++ b/openfpga/src/utils/physical_pb_utils.cpp @@ -191,12 +191,13 @@ static void synchronize_primitive_physical_pb_atom_nets( t_model_ports* model_port = pb_graph_node->input_pins[iport][ipin].port->model_port; /* Special for LUTs, the model port is hidden under 1 level */ - if (LUT_CLASS == pb_graph_node->pb_type->class_type) { - VTR_ASSERT(pb_graph_node->pb_type->num_modes == 2); - model_port = pb_graph_node->child_pb_graph_nodes[1][0][0] - .input_pins[iport][ipin] - .port->model_port; - } + // Do NOT do this. Net mapping on LUT inputs may be swapped during rerouting + //if (LUT_CLASS == pb_graph_node->pb_type->class_type) { + // VTR_ASSERT(pb_graph_node->pb_type->num_modes == 2); + // model_port = pb_graph_node->child_pb_graph_nodes[1][0][0] + // .input_pins[iport][ipin] + // .port->model_port; + //} /* It seems that LUT port are no longer built with an internal model */ if (nullptr == model_port) { VTR_LOGV(verbose, "Skip due to empty model port\n"); @@ -228,12 +229,13 @@ static void synchronize_primitive_physical_pb_atom_nets( t_model_ports* model_port = pb_graph_node->output_pins[iport][ipin].port->model_port; /* Special for LUTs, the model port is hidden under 1 level */ - if (LUT_CLASS == pb_graph_node->pb_type->class_type) { - VTR_ASSERT(pb_graph_node->pb_type->num_modes == 2); - model_port = pb_graph_node->child_pb_graph_nodes[1][0][0] - .output_pins[iport][ipin] - .port->model_port; - } + // Do NOT do this. Net mapping on LUT inputs may be swapped during rerouting + //if (LUT_CLASS == pb_graph_node->pb_type->class_type) { + // VTR_ASSERT(pb_graph_node->pb_type->num_modes == 2); + // model_port = pb_graph_node->child_pb_graph_nodes[1][0][0] + // .output_pins[iport][ipin] + // .port->model_port; + //} if (nullptr == model_port) { VTR_LOGV(verbose, "Skip due to empty model port\n"); continue; From ad8ad25250e8a703948236ed64ac9ea4e954635c Mon Sep 17 00:00:00 2001 From: tangxifan Date: Fri, 31 May 2024 19:44:40 -0700 Subject: [PATCH 17/19] [core] format --- openfpga/src/utils/physical_pb_utils.cpp | 36 +++++++++++++----------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/openfpga/src/utils/physical_pb_utils.cpp b/openfpga/src/utils/physical_pb_utils.cpp index 29a2164d2..ddb8c954f 100644 --- a/openfpga/src/utils/physical_pb_utils.cpp +++ b/openfpga/src/utils/physical_pb_utils.cpp @@ -190,14 +190,16 @@ static void synchronize_primitive_physical_pb_atom_nets( pb_graph_node->input_pins[iport][ipin].to_string().c_str()); t_model_ports* model_port = pb_graph_node->input_pins[iport][ipin].port->model_port; - /* Special for LUTs, the model port is hidden under 1 level */ - // Do NOT do this. Net mapping on LUT inputs may be swapped during rerouting - //if (LUT_CLASS == pb_graph_node->pb_type->class_type) { - // VTR_ASSERT(pb_graph_node->pb_type->num_modes == 2); - // model_port = pb_graph_node->child_pb_graph_nodes[1][0][0] - // .input_pins[iport][ipin] - // .port->model_port; - //} + /* Special for LUTs, the model port is hidden under 1 level + * Do NOT do this. Net mapping on LUT inputs may be swapped during + * rerouting + * if (LUT_CLASS == pb_graph_node->pb_type->class_type) { + * VTR_ASSERT(pb_graph_node->pb_type->num_modes == 2); + * model_port = pb_graph_node->child_pb_graph_nodes[1][0][0] + * .input_pins[iport][ipin] + * .port->model_port; + * } + */ /* It seems that LUT port are no longer built with an internal model */ if (nullptr == model_port) { VTR_LOGV(verbose, "Skip due to empty model port\n"); @@ -228,14 +230,16 @@ static void synchronize_primitive_physical_pb_atom_nets( pb_graph_node->output_pins[iport][ipin].to_string().c_str()); t_model_ports* model_port = pb_graph_node->output_pins[iport][ipin].port->model_port; - /* Special for LUTs, the model port is hidden under 1 level */ - // Do NOT do this. Net mapping on LUT inputs may be swapped during rerouting - //if (LUT_CLASS == pb_graph_node->pb_type->class_type) { - // VTR_ASSERT(pb_graph_node->pb_type->num_modes == 2); - // model_port = pb_graph_node->child_pb_graph_nodes[1][0][0] - // .output_pins[iport][ipin] - // .port->model_port; - //} + /* Special for LUTs, the model port is hidden under 1 level + * Do NOT do this. Net mapping on LUT inputs may be swapped during + * rerouting + * if (LUT_CLASS == pb_graph_node->pb_type->class_type) { + * VTR_ASSERT(pb_graph_node->pb_type->num_modes == 2); + * model_port = pb_graph_node->child_pb_graph_nodes[1][0][0] + * .output_pins[iport][ipin] + * .port->model_port; + * } + */ if (nullptr == model_port) { VTR_LOGV(verbose, "Skip due to empty model port\n"); continue; From ad2d1015544ccd82c61557b0c80409f95e9515f6 Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 2 Jun 2024 14:23:08 -0700 Subject: [PATCH 18/19] [test] deploy new benchmarks --- .../rst_on_lut_4bit/rst_on_lut_4bit.v | 35 +++++++++++++++++++ .../fpga_bitstream_reg_test.sh | 1 + .../config/rst_on_lut_repack_dc.xml | 2 +- .../repack_ignore_nets/config/task.conf | 5 +++ 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 openfpga_flow/benchmarks/micro_benchmark/rst_on_lut_4bit/rst_on_lut_4bit.v diff --git a/openfpga_flow/benchmarks/micro_benchmark/rst_on_lut_4bit/rst_on_lut_4bit.v b/openfpga_flow/benchmarks/micro_benchmark/rst_on_lut_4bit/rst_on_lut_4bit.v new file mode 100644 index 000000000..33a8db5f3 --- /dev/null +++ b/openfpga_flow/benchmarks/micro_benchmark/rst_on_lut_4bit/rst_on_lut_4bit.v @@ -0,0 +1,35 @@ +///////////////////////////////////////// +// Functionality: 4-bit version of A register driven by a combinational logic with reset signal +// Author: Xifan Tang +//////////////////////////////////////// +`timescale 1ns / 1ps + +module rst_on_lut_4bit(a, b0, b1, b2, b3, q, out0, out1, out2, out3, clk, rst); + +input wire rst; +input wire clk; +input wire a; +input wire b0; +input wire b1; +input wire b2; +input wire b3; +output reg q; +output wire out0; +output wire out1; +output wire out2; +output wire out3; + +always @(posedge rst or posedge clk) begin + if (rst) begin + q <= 0; + end else begin + q <= a; + end +end + +assign out0 = b0 & ~rst; +assign out1 = b1 & ~rst; +assign out2 = b2 & ~rst; +assign out3 = b3 & ~rst; + +endmodule diff --git a/openfpga_flow/regression_test_scripts/fpga_bitstream_reg_test.sh b/openfpga_flow/regression_test_scripts/fpga_bitstream_reg_test.sh index 32b6c7147..174b4cabe 100755 --- a/openfpga_flow/regression_test_scripts/fpga_bitstream_reg_test.sh +++ b/openfpga_flow/regression_test_scripts/fpga_bitstream_reg_test.sh @@ -28,6 +28,7 @@ run-task fpga_bitstream/load_external_architecture_bitstream $@ echo -e "Testing repacker capability in identifying wire LUTs"; run-task fpga_bitstream/repack_wire_lut $@ run-task fpga_bitstream/repack_wire_lut_strong $@ +run-task fpga_bitstream/repack_ignore_nets $@ echo -e "Testing overloading default paths for programmable interconnect when generating bitstream"; run-task fpga_bitstream/overload_mux_default_path $@ diff --git a/openfpga_flow/tasks/fpga_bitstream/repack_ignore_nets/config/rst_on_lut_repack_dc.xml b/openfpga_flow/tasks/fpga_bitstream/repack_ignore_nets/config/rst_on_lut_repack_dc.xml index 71153e425..748e23269 100644 --- a/openfpga_flow/tasks/fpga_bitstream/repack_ignore_nets/config/rst_on_lut_repack_dc.xml +++ b/openfpga_flow/tasks/fpga_bitstream/repack_ignore_nets/config/rst_on_lut_repack_dc.xml @@ -2,7 +2,7 @@ - + diff --git a/openfpga_flow/tasks/fpga_bitstream/repack_ignore_nets/config/task.conf b/openfpga_flow/tasks/fpga_bitstream/repack_ignore_nets/config/task.conf index 63ffd257c..c95c5d2e7 100644 --- a/openfpga_flow/tasks/fpga_bitstream/repack_ignore_nets/config/task.conf +++ b/openfpga_flow/tasks/fpga_bitstream/repack_ignore_nets/config/task.conf @@ -28,6 +28,7 @@ arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/vpr_arch/k4_frac_N4_tileable_fracff_lo [BENCHMARKS] bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/two_dff_inv_rst/two_dff_inv_rst.v bench1=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/rst_on_lut/rst_on_lut.v +bench2=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/rst_on_lut_4bit/rst_on_lut_4bit.v [SYNTHESIS_PARAM] # Yosys script parameters @@ -45,6 +46,10 @@ bench1_top = rst_on_lut bench1_openfpga_pin_constraints_file = ${PATH:TASK_DIR}/config/rst_on_lut_pc.xml bench1_openfpga_repack_design_constraint_file=${PATH:TASK_DIR}/config/rst_on_lut_repack_dc.xml +bench2_top = rst_on_lut_4bit +bench2_openfpga_pin_constraints_file = ${PATH:TASK_DIR}/config/rst_on_lut_pc.xml +bench2_openfpga_repack_design_constraint_file=${PATH:TASK_DIR}/config/rst_on_lut_repack_dc.xml + [SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] end_flow_with_test= vpr_fpga_verilog_formal_verification_top_netlist= From 4d9aacdf8f3791ca0a970485533cc3d79809dcba Mon Sep 17 00:00:00 2001 From: tangxifan Date: Sun, 2 Jun 2024 14:27:02 -0700 Subject: [PATCH 19/19] [test] add and deploy new benchmark --- .../rst_on_lut_8bit/rst_on_lut_8bit.v | 47 +++++++++++++++++++ .../repack_ignore_nets/config/task.conf | 5 ++ 2 files changed, 52 insertions(+) create mode 100644 openfpga_flow/benchmarks/micro_benchmark/rst_on_lut_8bit/rst_on_lut_8bit.v diff --git a/openfpga_flow/benchmarks/micro_benchmark/rst_on_lut_8bit/rst_on_lut_8bit.v b/openfpga_flow/benchmarks/micro_benchmark/rst_on_lut_8bit/rst_on_lut_8bit.v new file mode 100644 index 000000000..30c97205a --- /dev/null +++ b/openfpga_flow/benchmarks/micro_benchmark/rst_on_lut_8bit/rst_on_lut_8bit.v @@ -0,0 +1,47 @@ +///////////////////////////////////////// +// Functionality: 8-bit version of A register driven by a combinational logic with reset signal +// Author: Xifan Tang +//////////////////////////////////////// +`timescale 1ns / 1ps + +module rst_on_lut_8bit(a, b0, b1, b2, b3, b4, b5, b6, b7, q, out0, out1, out2, out3, out4, out5, out6, out7, clk, rst); + +input wire rst; +input wire clk; +input wire a; +input wire b0; +input wire b1; +input wire b2; +input wire b3; +input wire b4; +input wire b5; +input wire b6; +input wire b7; +output reg q; +output wire out0; +output wire out1; +output wire out2; +output wire out3; +output wire out4; +output wire out5; +output wire out6; +output wire out7; + +always @(posedge rst or posedge clk) begin + if (rst) begin + q <= 0; + end else begin + q <= a; + end +end + +assign out0 = b0 & ~rst; +assign out1 = b1 & ~rst; +assign out2 = b2 & ~rst; +assign out3 = b3 & ~rst; +assign out4 = b4 & ~rst; +assign out5 = b5 & ~rst; +assign out6 = b6 & ~rst; +assign out7 = b7 & ~rst; + +endmodule diff --git a/openfpga_flow/tasks/fpga_bitstream/repack_ignore_nets/config/task.conf b/openfpga_flow/tasks/fpga_bitstream/repack_ignore_nets/config/task.conf index c95c5d2e7..6076c364f 100644 --- a/openfpga_flow/tasks/fpga_bitstream/repack_ignore_nets/config/task.conf +++ b/openfpga_flow/tasks/fpga_bitstream/repack_ignore_nets/config/task.conf @@ -29,6 +29,7 @@ arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/vpr_arch/k4_frac_N4_tileable_fracff_lo bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/two_dff_inv_rst/two_dff_inv_rst.v bench1=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/rst_on_lut/rst_on_lut.v bench2=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/rst_on_lut_4bit/rst_on_lut_4bit.v +bench3=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/rst_on_lut_8bit/rst_on_lut_8bit.v [SYNTHESIS_PARAM] # Yosys script parameters @@ -50,6 +51,10 @@ bench2_top = rst_on_lut_4bit bench2_openfpga_pin_constraints_file = ${PATH:TASK_DIR}/config/rst_on_lut_pc.xml bench2_openfpga_repack_design_constraint_file=${PATH:TASK_DIR}/config/rst_on_lut_repack_dc.xml +bench3_top = rst_on_lut_8bit +bench3_openfpga_pin_constraints_file = ${PATH:TASK_DIR}/config/rst_on_lut_pc.xml +bench3_openfpga_repack_design_constraint_file=${PATH:TASK_DIR}/config/rst_on_lut_repack_dc.xml + [SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH] end_flow_with_test= vpr_fpga_verilog_formal_verification_top_netlist=