Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 413e6ec

Browse files
committedOct 18, 2024·
split large carry chain into small chains
1 parent 535c687 commit 413e6ec

File tree

1 file changed

+51
-28
lines changed

1 file changed

+51
-28
lines changed
 

‎src/synth_rapidsilicon.cc

Lines changed: 51 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2267,34 +2267,57 @@ struct SynthRapidSiliconPass : public ScriptPass {
22672267

22682268
for (auto &chain : carry_chains)
22692269
{
2270-
const std::vector<Cell *> &chain_ = chain.second;
2271-
int extra_carry = chain_.size() - max_carry_length;
2272-
if (extra_carry > 0)
2270+
std::vector<Cell*> original_chain = chain.second;
2271+
std::reverse(original_chain.begin(), original_chain.end());
2272+
2273+
std::vector<std::vector<Cell*>> sub_chains;
2274+
2275+
size_t i = 0;
2276+
size_t first_chunk_size = std::min(max_carry_length, static_cast<int>(original_chain.size()));
2277+
std::vector<Cell*> first_chain_chunk(original_chain.begin(), original_chain.begin() + first_chunk_size);
2278+
sub_chains.push_back(first_chain_chunk);
2279+
2280+
for (i = first_chunk_size; i < original_chain.size(); i += (max_carry_length - 1))
22732281
{
2274-
std::vector<Cell *> ExcessCarry;
2275-
ExcessCarry.reserve(extra_carry);
2276-
std::copy(chain_.begin(), chain_.begin() + extra_carry, std::back_inserter(ExcessCarry));
2282+
size_t chunk_size = std::min(max_carry_length - 1, static_cast<int>(original_chain.size() - i));
22772283

2278-
for (auto it = ExcessCarry.begin(); it != ExcessCarry.end();)
2279-
{
2280-
Cell *ec = *it;
2281-
2282-
log("Converting %s to logic.\n", log_id(ec->name));
2283-
RTLIL::Module *top_module = _design->top_module();
2284-
RTLIL::SigSpec np = top_module->addWire(NEW_ID, 1);
2285-
RTLIL::SigSpec and1 = top_module->addWire(NEW_ID, 1);
2286-
RTLIL::SigSpec and2 = top_module->addWire(NEW_ID, 1);
2287-
RTLIL::SigSpec c_out = top_module->addWire(NEW_ID, 1);
2288-
top_module->addXor(NEW_ID, ec->getPort(RTLIL::escape_id("P")), ec->getPort(RTLIL::escape_id("CIN")), ec->getPort(RTLIL::escape_id("O")));
2289-
top_module->addNot(NEW_ID, ec->getPort(RTLIL::escape_id("P")), np);
2290-
top_module->addAnd(NEW_ID, ec->getPort(RTLIL::escape_id("P")), ec->getPort(RTLIL::escape_id("CIN")), and1);
2291-
top_module->addAnd(NEW_ID, np, ec->getPort(RTLIL::escape_id("G")), and2);
2292-
top_module->addOr(NEW_ID, and1, and2, ec->getPort(RTLIL::escape_id("COUT")));
2293-
2294-
top_module->remove(ec);
2295-
it = ExcessCarry.erase(it);
2284+
std::vector<Cell*> chain_chunk;
2285+
chain_chunk.reserve(chunk_size + 1);
2286+
2287+
chain_chunk.push_back(sub_chains.back().back());
2288+
2289+
std::copy(original_chain.begin() + i, original_chain.begin() + i + chunk_size, std::back_inserter(chain_chunk));
2290+
2291+
sub_chains.push_back(chain_chunk);
2292+
}
2293+
2294+
bool ignore_chain1 = false;
2295+
for (auto _chain_ : sub_chains){
2296+
if (!ignore_chain1){
2297+
ignore_chain1=true;
2298+
continue;
22962299
}
2297-
ExcessCarry.clear();
2300+
2301+
RTLIL::Cell* cell_next = _chain_[1];
2302+
RTLIL::Cell* cell_prev = _chain_[0];
2303+
RTLIL::Module *top_module = _design->top_module();
2304+
RTLIL::IdString newName = top_module->uniquify(stringf("$first_adder%s",
2305+
log_id(cell_next->name)));
2306+
RTLIL::Cell* newcell = top_module->addCell(NEW_ID, "\\CARRY");
2307+
newcell->set_bool_attribute(ID::keep);
2308+
2309+
RTLIL::SigSpec cin = top_module->addWire(NEW_ID, 1);
2310+
RTLIL::SigSpec O = top_module->addWire(NEW_ID, 1);
2311+
newcell->setPort(RTLIL::escape_id("CIN"), {});
2312+
newcell->setPort(RTLIL::escape_id("O"), O);
2313+
newcell->setPort(RTLIL::escape_id("G"), cell_prev->getPort(RTLIL::escape_id("COUT")));
2314+
newcell->setPort(RTLIL::escape_id("P"), State::S0);
2315+
2316+
RTLIL::SigSpec cout = top_module->addWire(NEW_ID, 1);
2317+
newcell->setPort(RTLIL::escape_id("COUT"), cout);
2318+
cell_next->unsetPort(RTLIL::escape_id("CIN"));
2319+
cell_next->setPort(RTLIL::escape_id("CIN"),cout);
2320+
22982321
}
22992322
}
23002323
}
@@ -9045,9 +9068,9 @@ void collect_clocks (RTLIL::Module* module,
90459068
break;
90469069
}
90479070
}
9048-
if (cec) {
9049-
run("write_verilog -noexpr -noattr -nohex after_tech_map.v");
9050-
}
9071+
// if (cec) {
9072+
run("write_verilog -noexpr -nohex after_tech_map.v");
9073+
// }
90519074
//sec_check("after_tech_map", false);
90529075
sec_check("after_tech_map", true, true);
90539076

0 commit comments

Comments
 (0)
Please sign in to comment.