From 7a70565acdc181fa9c953eef4a0309bec5cef946 Mon Sep 17 00:00:00 2001 From: Keith Rothman <537074+litghost@users.noreply.github.com> Date: Wed, 12 Aug 2020 09:34:07 -0700 Subject: [PATCH] Avoid strcpy inside of atom netlist. Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com> --- vpr/src/base/atom_netlist.cpp | 19 ++++++++++++++++--- vpr/src/base/atom_netlist.h | 8 ++++++++ vpr/src/base/read_blif.cpp | 7 +++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/vpr/src/base/atom_netlist.cpp b/vpr/src/base/atom_netlist.cpp index 96886dacca7..39af4d23e1c 100644 --- a/vpr/src/base/atom_netlist.cpp +++ b/vpr/src/base/atom_netlist.cpp @@ -17,20 +17,33 @@ * */ AtomNetlist::AtomNetlist(std::string name, std::string id) - : Netlist(name, id) {} + : Netlist(name, id) + , inpad_model_(nullptr) + , outpad_model_(nullptr) {} /* * * Blocks * */ +void AtomNetlist::set_block_types(const t_model* inpad, const t_model* outpad) { + VTR_ASSERT(inpad != nullptr); + VTR_ASSERT(outpad != nullptr); + + inpad_model_ = inpad; + outpad_model_ = outpad; +} + AtomBlockType AtomNetlist::block_type(const AtomBlockId id) const { + VTR_ASSERT(inpad_model_ != nullptr); + VTR_ASSERT(outpad_model_ != nullptr); + const t_model* blk_model = block_model(id); AtomBlockType type = AtomBlockType::BLOCK; - if (blk_model->name == std::string(MODEL_INPUT)) { + if (blk_model == inpad_model_) { type = AtomBlockType::INPAD; - } else if (blk_model->name == std::string(MODEL_OUTPUT)) { + } else if (blk_model == outpad_model_) { type = AtomBlockType::OUTPAD; } else { type = AtomBlockType::BLOCK; diff --git a/vpr/src/base/atom_netlist.h b/vpr/src/base/atom_netlist.h index 1ed6fce5bae..df2bd202fce 100644 --- a/vpr/src/base/atom_netlist.h +++ b/vpr/src/base/atom_netlist.h @@ -87,6 +87,9 @@ class AtomNetlist : public Netlist> TruthTable; @@ -94,6 +97,7 @@ class AtomNetlist : public Netlist block_models_; //Architecture model of each block vtr::vector_map block_truth_tables_; //Truth tables of each block + //INPAD and OUTPUT models + const t_model* inpad_model_; + const t_model* outpad_model_; + //Port data vtr::vector_map port_models_; //Architecture port models of each port diff --git a/vpr/src/base/read_blif.cpp b/vpr/src/base/read_blif.cpp index 66506303024..d208ab98143 100644 --- a/vpr/src/base/read_blif.cpp +++ b/vpr/src/base/read_blif.cpp @@ -51,6 +51,10 @@ struct BlifAllocCallback : public blifparse::Callback { , blif_format_(blif_format) { VTR_ASSERT(blif_format_ == e_circuit_format::BLIF || blif_format_ == e_circuit_format::EBLIF); + inpad_model_ = find_model(MODEL_INPUT); + outpad_model_ = find_model(MODEL_OUTPUT); + + main_netlist_.set_block_types(inpad_model_, outpad_model_); } static constexpr const char* OUTPAD_NAME_PREFIX = "out:"; @@ -70,6 +74,7 @@ struct BlifAllocCallback : public blifparse::Callback { //Create a new model, and set it's name blif_models_.emplace_back(model_name, netlist_id_); + blif_models_.back().set_block_types(inpad_model_, outpad_model_); blif_models_black_box_.emplace_back(false); ended_ = false; set_curr_block(AtomBlockId::INVALID()); //This statement doesn't define a block, so mark invalid @@ -629,6 +634,8 @@ struct BlifAllocCallback : public blifparse::Callback { const std::string netlist_id_; ///