Skip to content

Commit 200aa75

Browse files
committed
Added a command line option controlling circuit netlist writeout
Signed-off-by: Maciej Kurc <[email protected]>
1 parent 9e26e6b commit 200aa75

File tree

8 files changed

+38
-17
lines changed

8 files changed

+38
-17
lines changed

vpr/src/base/read_circuit.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#include "vtr_path.h"
1313
#include "vtr_time.h"
1414

15+
#include "read_options.h"
16+
1517
static void process_circuit(AtomNetlist& netlist,
1618
e_const_gen_inference const_gen_inference_method,
1719
bool should_absorb_buffers,
@@ -23,9 +25,11 @@ static void process_circuit(AtomNetlist& netlist,
2325

2426
static void show_circuit_stats(const AtomNetlist& netlist);
2527

26-
AtomNetlist read_and_process_circuit(e_circuit_format circuit_format, t_vpr_setup& vpr_setup, t_arch& arch) {
28+
AtomNetlist read_and_process_circuit(const t_options& options, t_vpr_setup& vpr_setup, t_arch& arch) {
2729
// Options
28-
const char* circuit_file = vpr_setup.PackerOpts.circuit_file_name.c_str();
30+
const char* rd_circuit_file = vpr_setup.PackerOpts.circuit_file_name.c_str();
31+
const std::string& wr_circuit_file = options.write_circuit_file;
32+
e_circuit_format circuit_format = options.circuit_format;
2933
const t_model* user_models = vpr_setup.user_models;
3034
const t_model* library_models = vpr_setup.library_models;
3135
e_const_gen_inference const_gen_inference = vpr_setup.NetlistOpts.const_gen_inference;
@@ -37,16 +41,16 @@ AtomNetlist read_and_process_circuit(e_circuit_format circuit_format, t_vpr_setu
3741
bool verbosity = vpr_setup.NetlistOpts.netlist_verbosity;
3842

3943
if (circuit_format == e_circuit_format::AUTO) {
40-
auto name_ext = vtr::split_ext(circuit_file);
44+
auto name_ext = vtr::split_ext(rd_circuit_file);
4145

42-
VTR_LOGV(verbosity, "Circuit file: %s\n", circuit_file);
46+
VTR_LOGV(verbosity, "Circuit file: %s\n", rd_circuit_file);
4347
if (name_ext[1] == ".blif") {
4448
circuit_format = e_circuit_format::BLIF;
4549
} else if (name_ext[1] == ".eblif") {
4650
circuit_format = e_circuit_format::EBLIF;
4751
} else {
4852
VPR_FATAL_ERROR(VPR_ERROR_ATOM_NETLIST, "Failed to determine file format for '%s' expected .blif or .eblif extension",
49-
circuit_file);
53+
rd_circuit_file);
5054
}
5155
}
5256

@@ -57,15 +61,15 @@ AtomNetlist read_and_process_circuit(e_circuit_format circuit_format, t_vpr_setu
5761
switch (circuit_format) {
5862
case e_circuit_format::BLIF:
5963
case e_circuit_format::EBLIF:
60-
netlist = read_blif(circuit_format, circuit_file, user_models, library_models);
64+
netlist = read_blif(circuit_format, rd_circuit_file, user_models, library_models);
6165
break;
6266
case e_circuit_format::FPGA_INTERCHANGE:
63-
netlist = read_interchange_netlist(circuit_file, arch);
67+
netlist = read_interchange_netlist(rd_circuit_file, arch);
6468
break;
6569
default:
6670
VPR_FATAL_ERROR(VPR_ERROR_ATOM_NETLIST,
6771
"Unable to identify circuit file format for '%s'. Expect [blif|eblif|fpga-interchange]!\n",
68-
circuit_file);
72+
rd_circuit_file);
6973
break;
7074
}
7175
}
@@ -87,10 +91,15 @@ AtomNetlist read_and_process_circuit(e_circuit_format circuit_format, t_vpr_setu
8791
print_netlist_as_blif(getEchoFileName(E_ECHO_ATOM_NETLIST_CLEANED), netlist);
8892
}
8993

90-
show_circuit_stats(netlist);
94+
// Write FPGA interchange logical netlist.
95+
// TODO: Possibly allow writing BLIF/ELBIF via --write_circuit too
96+
// TODO: Possibly make separate options for read and write circuit format
97+
if (circuit_format == e_circuit_format::FPGA_INTERCHANGE && !wr_circuit_file.empty()) {
98+
vtr::ScopedStartFinishTimer t("Write circuit");
99+
write_interchange_netlist(wr_circuit_file, netlist, arch);
100+
}
91101

92-
// FIXME: Add option
93-
write_interchange_netlist("logical.netlist", netlist, arch);
102+
show_circuit_stats(netlist);
94103

95104
return netlist;
96105
}

vpr/src/base/read_circuit.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
#include "atom_netlist_fwd.h"
55
#include "vpr_types.h"
66

7+
struct t_options;
8+
79
enum class e_circuit_format {
810
AUTO, ///<Infer from file extension
911
BLIF, ///<Strict structural BLIF
1012
EBLIF, ///<Structural blif with extensions
1113
FPGA_INTERCHANGE ///<FPGA Interhange logical netlis format
1214
};
1315

14-
AtomNetlist read_and_process_circuit(e_circuit_format circuit_format, t_vpr_setup& vpr_setup, t_arch& arch);
16+
AtomNetlist read_and_process_circuit(const t_options& options, t_vpr_setup& vpr_setup, t_arch& arch);
1517
#endif

vpr/src/base/read_options.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,6 +1486,10 @@ argparse::ArgumentParser create_arg_parser(std::string prog_name, t_options& arg
14861486
.help("Writes the placement delay lookup to the specified file.")
14871487
.show_in(argparse::ShowIn::HELP_ONLY);
14881488

1489+
file_grp.add_argument(args.write_circuit_file, "--write_circuit")
1490+
.help("Writes the circuit netlist used for placement and routing to the specified file.")
1491+
.show_in(argparse::ShowIn::HELP_ONLY);
1492+
14891493
file_grp.add_argument(args.out_file_prefix, "--outfile_prefix")
14901494
.help("Prefix for output files")
14911495
.show_in(argparse::ShowIn::HELP_ONLY);

vpr/src/base/read_options.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ struct t_options {
3636
argparse::ArgValue<std::string> write_router_lookahead;
3737
argparse::ArgValue<std::string> read_router_lookahead;
3838

39+
argparse::ArgValue<std::string> write_circuit_file;
40+
3941
/* Stage Options */
4042
argparse::ArgValue<bool> do_packing;
4143
argparse::ArgValue<bool> do_placement;

vpr/src/base/vpr_api.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ void vpr_init_with_options(const t_options* options, t_vpr_setup* vpr_setup, t_a
313313

314314
/* Read blif file and sweep unused components */
315315
auto& atom_ctx = g_vpr_ctx.mutable_atom();
316-
atom_ctx.nlist = read_and_process_circuit(options->circuit_format, *vpr_setup, *arch);
316+
atom_ctx.nlist = read_and_process_circuit(*options, *vpr_setup, *arch);
317317

318318
if (vpr_setup->PowerOpts.do_power) {
319319
//Load the net activity file for power estimation

vpr/src/base/write_interchange_netlist.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ class NetlistBuilder {
473473

474474

475475
void write_interchange_netlist (
476-
const char* ic_netlist_file,
476+
const std::string& ic_netlist_file,
477477
const AtomNetlist& netlist,
478478
const t_arch& arch)
479479
{
@@ -491,7 +491,7 @@ void write_interchange_netlist (
491491
kj::ArrayPtr<kj::byte> bytes = words.asBytes();
492492

493493
// Write
494-
gzFile fp = gzopen(ic_netlist_file, "w");
494+
gzFile fp = gzopen(ic_netlist_file.c_str(), "w");
495495
VTR_ASSERT(fp != Z_NULL);
496496

497497
z_size_t res = gzwrite(fp, &bytes[0], bytes.size());

vpr/src/base/write_interchange_netlist.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include "vpr_types.h"
77

88
void write_interchange_netlist (
9-
const char* ic_netlist_file,
9+
const std::string& ic_netlist_file,
1010
const AtomNetlist& netlist,
1111
const t_arch& arch
1212
);

vpr/test/test_interchange_netlist.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "catch2/catch_test_macros.hpp"
22

3+
#include "argparse_value.hpp"
34
#include "read_circuit.h"
45
#include "read_fpga_interchange_arch.h"
56
#include "arch_util.h"
@@ -25,9 +26,12 @@ TEST_CASE("read_interchange_netlist", "[vpr]") {
2526
vpr_setup.library_models = arch.model_library;
2627
vpr_setup.PackerOpts.circuit_file_name = "lut.netlist";
2728

29+
t_options options;
30+
options.circuit_format.set(e_circuit_format::FPGA_INTERCHANGE, argparse::Provenance::SPECIFIED);
31+
2832
/* Read blif file and sweep unused components */
2933
auto& atom_ctx = g_vpr_ctx.mutable_atom();
30-
atom_ctx.nlist = read_and_process_circuit(e_circuit_format::FPGA_INTERCHANGE, vpr_setup, arch);
34+
atom_ctx.nlist = read_and_process_circuit(options, vpr_setup, arch);
3135
}
3236

3337
} // namespace

0 commit comments

Comments
 (0)