aboutsummaryrefslogtreecommitdiffstats
path: root/ice40/chains.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ice40/chains.cc')
-rw-r--r--ice40/chains.cc14
1 files changed, 9 insertions, 5 deletions
diff --git a/ice40/chains.cc b/ice40/chains.cc
index b3b54d6b..c8e98900 100644
--- a/ice40/chains.cc
+++ b/ice40/chains.cc
@@ -32,6 +32,7 @@ NEXTPNR_NAMESPACE_BEGIN
class ChainConstrainer
{
private:
+ int feedio_lcs = 0;
Context *ctx;
// Split a carry chain into multiple legal chains
std::vector<CellChain> split_carry_chain(CellChain &carryc)
@@ -55,6 +56,7 @@ class ChainConstrainer
CellInfo *feedin = make_carry_feed_in(cell, cell->ports.at(ctx->id("CIN")));
chains.back().cells.push_back(feedin);
tile.push_back(feedin);
+ ++feedio_lcs;
}
}
tile.push_back(cell);
@@ -78,6 +80,7 @@ class ChainConstrainer
at_end ? nullptr : *(curr_cell + 1));
chains.back().cells.push_back(passout);
tile.push_back(passout);
+ ++feedio_lcs;
}
}
++curr_cell;
@@ -91,8 +94,8 @@ class ChainConstrainer
{
NPNR_ASSERT(cout_port.net != nullptr);
std::unique_ptr<CellInfo> lc = create_ice_cell(ctx, ctx->id("ICESTORM_LC"));
- lc->params[ctx->id("LUT_INIT")] = "65280"; // 0xff00: O = I3
- lc->params[ctx->id("CARRY_ENABLE")] = "1";
+ lc->params[ctx->id("LUT_INIT")] = Property(65280, 16); // 0xff00: O = I3
+ lc->params[ctx->id("CARRY_ENABLE")] = Property::State::S1;
lc->ports.at(id_O).net = cout_port.net;
std::unique_ptr<NetInfo> co_i3_net(new NetInfo());
co_i3_net->name = ctx->id(lc->name.str(ctx) + "$I3");
@@ -167,9 +170,9 @@ class ChainConstrainer
{
NPNR_ASSERT(cin_port.net != nullptr);
std::unique_ptr<CellInfo> lc = create_ice_cell(ctx, ctx->id("ICESTORM_LC"));
- lc->params[ctx->id("CARRY_ENABLE")] = "1";
- lc->params[ctx->id("CIN_CONST")] = "1";
- lc->params[ctx->id("CIN_SET")] = "1";
+ lc->params[ctx->id("CARRY_ENABLE")] = Property::State::S1;
+ lc->params[ctx->id("CIN_CONST")] = Property::State::S1;
+ lc->params[ctx->id("CIN_SET")] = Property::State::S1;
lc->ports.at(ctx->id("I1")).net = cin_port.net;
cin_port.net->users.erase(std::remove_if(cin_port.net->users.begin(), cin_port.net->users.end(),
[cin_cell, cin_port](const PortRef &usr) {
@@ -281,6 +284,7 @@ class ChainConstrainer
chain.cells.at(0)->constr_children.push_back(chain.cells.at(i));
}
}
+ log_info(" %4d LCs used to legalise carry chains.\n", feedio_lcs);
}
public: