ice40: Use xArchArgs in validity check

Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
David Shah 2018-07-18 12:51:07 +02:00
parent 70cfa7a6a4
commit d392b5f635
4 changed files with 39 additions and 39 deletions

View File

@ -707,23 +707,28 @@ void Arch::assignArchArgs()
}
for (auto &cell : getCtx()->cells) {
CellInfo *ci = cell.second.get();
ci->belType = belTypeFromId(ci->type);
if (ci->type == id_icestorm_lc) {
ci->lcInfo.dffEnable = bool_or_default(ci->params, id_dff_en);
ci->lcInfo.negClk = bool_or_default(ci->params, id_neg_clk);
ci->lcInfo.clk = get_net_or_empty(ci, id_clk);
ci->lcInfo.cen = get_net_or_empty(ci, id_cen);
ci->lcInfo.sr = get_net_or_empty(ci, id_sr);
ci->lcInfo.inputCount = 0;
if (get_net_or_empty(ci, id_i0))
ci->lcInfo.inputCount++;
if (get_net_or_empty(ci, id_i1))
ci->lcInfo.inputCount++;
if (get_net_or_empty(ci, id_i2))
ci->lcInfo.inputCount++;
if (get_net_or_empty(ci, id_i3))
ci->lcInfo.inputCount++;
assignCellArgs(ci);
}
}
void Arch::assignCellArgs(CellInfo *cell)
{
cell->belType = belTypeFromId(cell->type);
if (cell->type == id_icestorm_lc) {
cell->lcInfo.dffEnable = bool_or_default(cell->params, id_dff_en);
cell->lcInfo.negClk = bool_or_default(cell->params, id_neg_clk);
cell->lcInfo.clk = get_net_or_empty(cell, id_clk);
cell->lcInfo.cen = get_net_or_empty(cell, id_cen);
cell->lcInfo.sr = get_net_or_empty(cell, id_sr);
cell->lcInfo.inputCount = 0;
if (get_net_or_empty(cell, id_i0))
cell->lcInfo.inputCount++;
if (get_net_or_empty(cell, id_i1))
cell->lcInfo.inputCount++;
if (get_net_or_empty(cell, id_i2))
cell->lcInfo.inputCount++;
if (get_net_or_empty(cell, id_i3))
cell->lcInfo.inputCount++;
}
}

View File

@ -709,6 +709,7 @@ struct Arch : BaseCtx
// Assign architecure-specific arguments to nets and cells, which must be called between packing or further
// netlist modifications, and validity checks
void assignArchArgs();
void assignCellArgs(CellInfo *cell);
IdString id_glb_buf_out;
IdString id_icestorm_lc, id_sb_io, id_sb_gb;

View File

@ -31,45 +31,37 @@ bool Arch::logicCellsCompatible(const std::vector<const CellInfo *> &cells) cons
int locals_count = 0;
for (auto cell : cells) {
if (bool_or_default(cell->params, id_dff_en)) {
NPNR_ASSERT(cell->belType == TYPE_ICESTORM_LC);
if (cell->lcInfo.dffEnable) {
if (!dffs_exist) {
dffs_exist = true;
cen = get_net_or_empty(cell, id_cen);
clk = get_net_or_empty(cell, id_clk);
sr = get_net_or_empty(cell, id_sr);
cen = cell->lcInfo.cen;
clk = cell->lcInfo.clk;
sr = cell->lcInfo.sr;
if (!isGlobalNet(cen) && cen != nullptr)
if (cen != nullptr && !cen->is_global)
locals_count++;
if (!isGlobalNet(clk) && clk != nullptr)
if (clk != nullptr && !clk->is_global)
locals_count++;
if (!isGlobalNet(sr) && sr != nullptr)
if (sr != nullptr && !sr->is_global)
locals_count++;
if (bool_or_default(cell->params, id_neg_clk)) {
if (cell->lcInfo.negClk) {
dffs_neg = true;
}
} else {
if (cen != get_net_or_empty(cell, id_cen))
if (cen != cell->lcInfo.cen)
return false;
if (clk != get_net_or_empty(cell, id_clk))
if (clk != cell->lcInfo.clk)
return false;
if (sr != get_net_or_empty(cell, id_sr))
if (sr != cell->lcInfo.sr)
return false;
if (dffs_neg != bool_or_default(cell->params, id_neg_clk))
if (dffs_neg != cell->lcInfo.negClk)
return false;
}
}
const NetInfo *i0 = get_net_or_empty(cell, id_i0), *i1 = get_net_or_empty(cell, id_i1),
*i2 = get_net_or_empty(cell, id_i2), *i3 = get_net_or_empty(cell, id_i3);
if (i0 != nullptr)
locals_count++;
if (i1 != nullptr)
locals_count++;
if (i2 != nullptr)
locals_count++;
if (i3 != nullptr)
locals_count++;
locals_count += cell->lcInfo.inputCount;
}
return locals_count <= 32;

View File

@ -372,6 +372,7 @@ class PlacementLegaliser
NPNR_ASSERT(ctx->nets.find(co_i3_name) == ctx->nets.end());
ctx->nets[co_i3_name] = std::move(co_i3_net);
IdString name = lc->name;
ctx->assignCellArgs(lc.get());
ctx->cells[lc->name] = std::move(lc);
createdCells.insert(name);
return ctx->cells[name].get();
@ -416,6 +417,7 @@ class PlacementLegaliser
ctx->nets[out_net_name] = std::move(out_net);
IdString name = lc->name;
ctx->assignCellArgs(lc.get());
ctx->cells[lc->name] = std::move(lc);
createdCells.insert(name);
return ctx->cells[name].get();