aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgatecat <gatecat@ds0.me>2021-06-29 14:48:47 +0100
committergatecat <gatecat@ds0.me>2021-06-29 14:48:47 +0100
commit2476f116bb2709cb1c01efd358b6c2b2edfda0c8 (patch)
tree67dd930f5a143a611e47e2c8983263b12ec213bd
parent78c965141f25892986589976476c237372d9406d (diff)
downloadnextpnr-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.h1
-rw-r--r--fpga_interchange/archdefs.h1
-rw-r--r--fpga_interchange/macros.cc6
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 &param : 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