diff options
author | gatecat <gatecat@ds0.me> | 2021-06-29 14:48:47 +0100 |
---|---|---|
committer | gatecat <gatecat@ds0.me> | 2021-06-29 14:48:47 +0100 |
commit | 2476f116bb2709cb1c01efd358b6c2b2edfda0c8 (patch) | |
tree | 67dd930f5a143a611e47e2c8983263b12ec213bd | |
parent | 78c965141f25892986589976476c237372d9406d (diff) | |
download | nextpnr-2476f116bb2709cb1c01efd358b6c2b2edfda0c8.tar.gz nextpnr-2476f116bb2709cb1c01efd358b6c2b2edfda0c8.tar.bz2 nextpnr-2476f116bb2709cb1c01efd358b6c2b2edfda0c8.zip |
interchange: Track the macros that cells have been expanded from
Signed-off-by: gatecat <gatecat@ds0.me>
-rw-r--r-- | fpga_interchange/arch.h | 1 | ||||
-rw-r--r-- | fpga_interchange/archdefs.h | 1 | ||||
-rw-r--r-- | fpga_interchange/macros.cc | 6 |
3 files changed, 8 insertions, 0 deletions
diff --git a/fpga_interchange/arch.h b/fpga_interchange/arch.h index fc3ea637..6e77054f 100644 --- a/fpga_interchange/arch.h +++ b/fpga_interchange/arch.h @@ -1152,6 +1152,7 @@ struct Arch : ArchAPI<ArchRanges> const DefaultCellConnsPOD *get_default_conns(IdString cell_type) const; void pack_default_conns(); + dict<IdString, std::vector<CellInfo *>> macro_to_cells; void expand_macros(); }; diff --git a/fpga_interchange/archdefs.h b/fpga_interchange/archdefs.h index 057de934..4a196c29 100644 --- a/fpga_interchange/archdefs.h +++ b/fpga_interchange/archdefs.h @@ -120,6 +120,7 @@ struct ArchCellInfo dict<IdString, std::vector<IdString>> cell_bel_pins; dict<IdString, std::vector<IdString>> masked_cell_bel_pins; pool<IdString> const_ports; + IdString macro_parent = IdString(); LutCell lut_cell; }; diff --git a/fpga_interchange/macros.cc b/fpga_interchange/macros.cc index 8339829f..42c8e1ba 100644 --- a/fpga_interchange/macros.cc +++ b/fpga_interchange/macros.cc @@ -66,6 +66,8 @@ void Arch::expand_macros() const MacroPOD *macro = lookup_macro(chip_info, exp ? IdString(exp->macro_name) : cell->type); if (macro == nullptr) continue; + // Get the ultimate root of this macro expansion + IdString parent = (cell->macro_parent == IdString()) ? cell->name : cell->macro_parent; // Create child instances for (const auto &inst : macro->cell_insts) { CellInfo *inst_cell = @@ -73,6 +75,7 @@ void Arch::expand_macros() for (const auto ¶m : inst.parameters) { inst_cell->params[IdString(param.key)] = IdString(param.value).str(ctx); } + inst_cell->macro_parent = parent; next_cells.push_back(inst_cell); } // Create and connect nets @@ -156,6 +159,9 @@ void Arch::expand_macros() std::swap(next_cells, cells); next_cells.clear(); } while (!cells.empty()); + // Do this at the end, otherwise we might add cells that are later destroyed + for (auto &cell : ctx->cells) + macro_to_cells[cell.second->macro_parent].push_back(cell.second.get()); } NEXTPNR_NAMESPACE_END |