From e3d8b21cb3cac91d96e797b2de382dc93d5fa14d Mon Sep 17 00:00:00 2001 From: Alessandro Comodi Date: Thu, 6 Jun 2019 22:58:22 +0200 Subject: [PATCH] vpr: added option for dangling comb nodes Signed-off-by: Alessandro Comodi --- vpr/src/base/read_options.cpp | 10 ++++++++++ vpr/src/base/read_options.h | 1 + vpr/src/base/vpr_api.cpp | 2 +- vpr/src/timing/timing_graph_builder.cpp | 10 +++++++--- vpr/src/timing/timing_graph_builder.h | 4 ++-- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/vpr/src/base/read_options.cpp b/vpr/src/base/read_options.cpp index f44410d86db..232f848cb6e 100644 --- a/vpr/src/base/read_options.cpp +++ b/vpr/src/base/read_options.cpp @@ -949,6 +949,16 @@ static argparse::ArgumentParser create_arg_parser(std::string prog_name, t_optio "This option should be only used for development purposes.") .default_value(""); + gen_grp.add_argument(args.allow_dangling_combinational_nodes, "--allow_dangling_combinational_nodes") + .help( + "Option to allow dangling combinational nodes in the timing graph.\n" + "This option should normally be off, as dangling combinational nodes are unusual\n" + "in the timing graph and may indicate a problem in the circuit or architecture.\n" + "Unless you understand why your architecture/circuit can have valid dangling combinational nodes, this option should be off.\n" + "In general this is a dev-only option and should not be turned on by the end-user.") + .default_value("off") + .show_in(argparse::ShowIn::HELP_ONLY); + auto& file_grp = parser.add_argument_group("file options"); file_grp.add_argument(args.BlifFile, "--circuit_file") diff --git a/vpr/src/base/read_options.h b/vpr/src/base/read_options.h index e7a5dc48523..11c83921f43 100644 --- a/vpr/src/base/read_options.h +++ b/vpr/src/base/read_options.h @@ -52,6 +52,7 @@ struct t_options { argparse::ArgValue strict_checks; argparse::ArgValue disable_errors; argparse::ArgValue suppress_warnings; + argparse::ArgValue allow_dangling_combinational_nodes; /* Atom netlist options */ argparse::ArgValue absorb_buffer_luts; diff --git a/vpr/src/base/vpr_api.cpp b/vpr/src/base/vpr_api.cpp index 606e8cad8d3..7f5cb93772d 100644 --- a/vpr/src/base/vpr_api.cpp +++ b/vpr/src/base/vpr_api.cpp @@ -304,7 +304,7 @@ void vpr_init(const int argc, const char** argv, t_options* options, t_vpr_setup auto& timing_ctx = g_vpr_ctx.mutable_timing(); { vtr::ScopedStartFinishTimer t("Build Timing Graph"); - timing_ctx.graph = TimingGraphBuilder(atom_ctx.nlist, atom_ctx.lookup).timing_graph(); + timing_ctx.graph = TimingGraphBuilder(atom_ctx.nlist, atom_ctx.lookup).timing_graph(options->allow_dangling_combinational_nodes); VTR_LOG(" Timing Graph Nodes: %zu\n", timing_ctx.graph->nodes().size()); VTR_LOG(" Timing Graph Edges: %zu\n", timing_ctx.graph->edges().size()); VTR_LOG(" Timing Graph Levels: %zu\n", timing_ctx.graph->levels().size()); diff --git a/vpr/src/timing/timing_graph_builder.cpp b/vpr/src/timing/timing_graph_builder.cpp index 66b8f83c975..86ff555711a 100644 --- a/vpr/src/timing/timing_graph_builder.cpp +++ b/vpr/src/timing/timing_graph_builder.cpp @@ -40,8 +40,8 @@ TimingGraphBuilder::TimingGraphBuilder(const AtomNetlist& netlist, //pass } -std::unique_ptr TimingGraphBuilder::timing_graph() { - build(); +std::unique_ptr TimingGraphBuilder::timing_graph(bool allow_dangling_combinational_nodes) { + build(allow_dangling_combinational_nodes); opt_memory_layout(); VTR_ASSERT(tg_); @@ -50,9 +50,13 @@ std::unique_ptr TimingGraphBuilder::timing_graph() { return std::move(tg_); } -void TimingGraphBuilder::build() { +void TimingGraphBuilder::build(bool allow_dangling_combinational_nodes) { tg_ = std::make_unique(); + // Optionally allow dangling combinational nodes. + // Set by `--allow_dangling_combinational_nodes on`. Default value is false + tg_->set_allow_dangling_combinational_nodes(allow_dangling_combinational_nodes); + for (AtomBlockId blk : netlist_.blocks()) { AtomBlockType blk_type = netlist_.block_type(blk); diff --git a/vpr/src/timing/timing_graph_builder.h b/vpr/src/timing/timing_graph_builder.h index 0ca93d1e19f..8e6745b7cb1 100644 --- a/vpr/src/timing/timing_graph_builder.h +++ b/vpr/src/timing/timing_graph_builder.h @@ -10,10 +10,10 @@ class TimingGraphBuilder { TimingGraphBuilder(const AtomNetlist& netlist, AtomLookup& netlist_lookup); - std::unique_ptr timing_graph(); + std::unique_ptr timing_graph(bool allow_dangling_combinational_nodes); private: - void build(); + void build(bool allow_dangling_combinational_nodes); void opt_memory_layout(); void add_io_to_timing_graph(const AtomBlockId blk);