diff options
author | David Shah <dave@ds0.me> | 2019-11-29 15:58:02 +0000 |
---|---|---|
committer | David Shah <dave@ds0.me> | 2019-12-27 10:44:30 +0000 |
commit | 9f6031cda13a290903785a1c469af02838309b39 (patch) | |
tree | 95352044e09c1d0ba2b486d0d216a6fb2fb27d7c /frontend | |
parent | 6bf3c261fa3e13319430380096aca65042476ae3 (diff) | |
download | nextpnr-9f6031cda13a290903785a1c469af02838309b39.tar.gz nextpnr-9f6031cda13a290903785a1c469af02838309b39.tar.bz2 nextpnr-9f6031cda13a290903785a1c469af02838309b39.zip |
frontend_base: Import cell hierarchy
Signed-off-by: David Shah <dave@ds0.me>
Diffstat (limited to 'frontend')
-rw-r--r-- | frontend/frontend_base.h | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/frontend/frontend_base.h b/frontend/frontend_base.h index c23e2196..be764266 100644 --- a/frontend/frontend_base.h +++ b/frontend/frontend_base.h @@ -131,8 +131,10 @@ template <typename FrontendType> struct GenericFrontend HierModuleState m; m.is_toplevel = true; m.prefix = ""; + m.path = top; + ctx->top_module = top; // Do the actual import, starting from the top level module - import_module(m, mod_refs.at(top)); + import_module(m, top.str(ctx), top.str(ctx), mod_refs.at(top)); } Context *ctx; @@ -239,6 +241,7 @@ template <typename FrontendType> struct GenericFrontend { bool is_toplevel; std::string prefix; + IdString parent_path, path; // Map from index in module to "flat" index of nets std::vector<int> index_to_net_flatindex; // Get a reference to index_to_net; resizing if @@ -255,8 +258,14 @@ template <typename FrontendType> struct GenericFrontend std::vector<std::vector<std::string>> net_names; }; - void import_module(HierModuleState &m, const mod_dat_t &data) + void import_module(HierModuleState &m, const std::string &name, const std::string &type, const mod_dat_t &data) { + NPNR_ASSERT(!ctx->hierarchy.count(m.path)); + ctx->hierarchy[m.path].name = ctx->id(name); + ctx->hierarchy[m.path].type = ctx->id(type); + ctx->hierarchy[m.path].parent = m.parent_path; + ctx->hierarchy[m.path].fullpath = m.path; + std::vector<NetInfo *> index_to_net; if (!m.is_toplevel) { // Import port connections; for submodules only @@ -414,6 +423,7 @@ template <typename FrontendType> struct GenericFrontend void import_leaf_cell(HierModuleState &m, const std::string &name, const cell_dat_t &cd) { IdString inst_name = unique_name(m.prefix, name, false); + ctx->hierarchy[m.path].leaf_cells[ctx->id(name)] = inst_name; CellInfo *ci = ctx->createCell(inst_name, ctx->id(impl.get_cell_type(cd))); // Import port directions std::unordered_map<IdString, PortType> port_dirs; @@ -488,8 +498,11 @@ template <typename FrontendType> struct GenericFrontend submod.prefix = m.prefix; submod.prefix += name; submod.prefix += '.'; + submod.parent_path = m.path; + submod.path = ctx->id(m.path.str(ctx) + "/" + name); // Do the submodule import - import_module(submod, mod_refs.at(ctx->id(impl.get_cell_type(cd)))); + auto type = impl.get_cell_type(cd); + import_module(submod, name, type, mod_refs.at(ctx->id(type))); } // Import the cells section of a module |