3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2026-07-15 03:35:40 +00:00

WIP migration to twine

This commit is contained in:
Emil J. Tywoniak 2026-06-18 21:54:57 +02:00
parent 0c450ce8c8
commit bffe7a6e57
7 changed files with 62 additions and 32 deletions

View file

@ -1484,7 +1484,7 @@ void AST::process(RTLIL::Design *design, AstNode *ast, bool nodisplay, bool dump
if (defer_local)
child->str = "$abstract" + child->str;
TwineRef mod_name = TwineSearch(&design->twines).find(child->str);
TwineRef mod_name = design->twines.find(child->str);
if (design->has(mod_name)) {
RTLIL::Module *existing_mod = design->module(mod_name);
if (!nooverwrite && !overwrite && !existing_mod->get_blackbox_attribute()) {
@ -1720,11 +1720,10 @@ TwineRef AstModule::derive(RTLIL::Design *design, const dict<RTLIL::IdString, RT
if (has_interfaces)
new_modname += "$interfaces$" + interf_info;
TwineSearch search(&design->twines);
TwineRef new_modname_ref = search.find(new_modname);
TwineRef new_modname_ref = design->twines.find(new_modname);
if (!design->has(new_modname_ref)) {
if (!new_ast) {
TwineRef modname_ref = search.find(modname);
TwineRef modname_ref = design->twines.find(modname);
auto mod = dynamic_cast<AstModule*>(design->module(modname_ref));
new_ast = mod->ast->clone();
}
@ -1748,7 +1747,7 @@ TwineRef AstModule::derive(RTLIL::Design *design, const dict<RTLIL::IdString, RT
}
process_module(design, new_ast.get(), false);
TwineRef new_ref = TwineSearch(&design->twines).find(modname);
TwineRef new_ref = design->twines.find(modname);
design->module(new_ref)->check();
RTLIL::Module* mod = design->module(new_ref);
@ -1872,7 +1871,7 @@ std::string AstModule::derive_common(RTLIL::Design *design, const dict<RTLIL::Id
if (parameters.size()) // not named_parameters to cover hierarchical defparams
modname = derived_module_name(stripped_name, named_parameters);
if (design->has(TwineSearch(&design->twines).find(modname)))
if (design->has(design->twines.find(modname)))
return modname;
if (!quiet)

View file

@ -178,7 +178,7 @@ static void check_unique_id(RTLIL::Module *module, RTLIL::IdString id,
to_add_kind, id.c_str(), existing_kind, location_str.c_str());
};
TwineRef id_tw = TwineSearch(&module->design->twines).find(id.str());
TwineRef id_tw = module->design->twines.find(id.str());
if (const RTLIL::Wire *wire = module->wire(id_tw))
already_exists(wire, "signal");
if (const RTLIL::Cell *cell = module->cell(id_tw))
@ -500,13 +500,12 @@ struct AST_INTERNAL::ProcessGenerator
continue;
std::string wire_name;
TwineSearch search(&current_module->design->twines);
do {
wire_name = stringf("$%d%s[%d:%d]", new_temp_count[chunk.wire]++,
chunk.wire->name, chunk.width+chunk.offset-1, chunk.offset);;
if (chunk.wire->name.str().find('$') != std::string::npos)
wire_name += stringf("$%d", autoidx++);
} while (current_module->wire(search.find(wire_name)) != nullptr);
} while (current_module->wire(current_module->design->twines.find(wire_name)) != nullptr);
RTLIL::Wire *wire = current_module->addWire(current_module->design->twines.add(std::string{wire_name}), chunk.width);
set_src_attr(wire, always.get());
@ -985,7 +984,8 @@ struct AST_INTERNAL::ProcessGenerator
set_src_attr(&action, child.get());
action.memid = memid;
action.address = child->children[0]->genWidthRTLIL(-1, true, &subst_rvalue_map.stdmap());
action.data = child->children[1]->genWidthRTLIL(current_module->memories[TwineSearch(&current_module->design->twines).find(memid)]->width, true, &subst_rvalue_map.stdmap());
TwineRef memid_tw = current_module->design->twines.find(memid);
action.data = child->children[1]->genWidthRTLIL(current_module->memories[memid_tw]->width, true, &subst_rvalue_map.stdmap());
action.enable = child->children[2]->genWidthRTLIL(-1, true, &subst_rvalue_map.stdmap());
RTLIL::Const orig_priority_mask = child->children[4]->bitsAsConst();
RTLIL::Const priority_mask = RTLIL::Const(0, cur_idx);
@ -1629,8 +1629,7 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
log_assert(id2ast != nullptr);
TwineSearch search(&current_module->design->twines);
TwineRef str_ref = search.find(str);
TwineRef str_ref = current_module->design->twines.find(str);
if (id2ast->type == AST_AUTOWIRE && current_module->wire(str_ref) == nullptr) {
RTLIL::Wire *wire = current_module->addWire(current_module->design->twines.add(std::string{str}));
@ -1677,7 +1676,7 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
// with the individual signals:
if (is_interface) {
IdString dummy_wire_name = stringf("$dummywireforinterface%s", str);
RTLIL::Wire *dummy_wire = current_module->wire(search.find(dummy_wire_name.str()));
RTLIL::Wire *dummy_wire = current_module->wire(current_module->design->twines.find(dummy_wire_name.str()));
if (!dummy_wire) {
dummy_wire = current_module->addWire(current_module->design->twines.add(std::string{dummy_wire_name.str()}));
dummy_wire->set_bool_attribute(ID::is_interface);
@ -2052,7 +2051,8 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
RTLIL::Cell *cell = current_module->addCell(current_module->design->twines.add(std::string{sstr.str()}), TW::$memrd);
set_src_attr(cell, this);
RTLIL::Wire *wire = current_module->addWire(current_module->design->twines.add(std::string{cell->name.str() + "_DATA"}), current_module->memories[TwineSearch(&current_module->design->twines).find(str)]->width);
TwineRef mem_tw = current_module->design->twines.find(str);
RTLIL::Wire *wire = current_module->addWire(current_module->design->twines.add(std::string{cell->name.str() + "_DATA"}), current_module->memories[mem_tw]->width);
set_src_attr(wire, this);
int mem_width, mem_size, addr_bits;
@ -2102,13 +2102,14 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
SigSpec addr_sig = children[0]->genRTLIL();
TwineRef mem_tw = current_module->design->twines.find(str);
cell->setPort(TW::ADDR, addr_sig);
cell->setPort(TW::DATA, children[1]->genWidthRTLIL(current_module->memories[TwineSearch(&current_module->design->twines).find(str)]->width * num_words, true));
cell->setPort(TW::DATA, children[1]->genWidthRTLIL(current_module->memories[mem_tw]->width * num_words, true));
cell->setPort(TW::EN, en_sig);
cell->parameters[ID::MEMID] = RTLIL::Const(str);
cell->parameters[ID::ABITS] = RTLIL::Const(GetSize(addr_sig));
cell->parameters[ID::WIDTH] = RTLIL::Const(current_module->memories[TwineSearch(&current_module->design->twines).find(str)]->width);
cell->parameters[ID::WIDTH] = RTLIL::Const(current_module->memories[mem_tw]->width);
cell->parameters[ID::PRIORITY] = RTLIL::Const(autoidx-1);
}

View file

@ -2097,8 +2097,10 @@ namespace {
void check()
{
if (!cell->type.begins_with("$") || cell->type.begins_with("$__") || cell->type.begins_with("$paramod") || cell->type.begins_with("$fmcombine") ||
cell->type.begins_with("$verific$") || cell->type.begins_with("$array:") || cell->type.begins_with("$extern:"))
std::string type_str = cell->type.str();
std::string_view type_sv = type_str;
if (!type_sv.starts_with("$") || type_sv.starts_with("$__") || type_sv.starts_with("$paramod") || type_sv.starts_with("$fmcombine") ||
type_sv.starts_with("$verific$") || type_sv.starts_with("$array:") || type_sv.starts_with("$extern:"))
return;
if (cell->type_impl == TW($buf)) {
@ -5258,8 +5260,10 @@ void RTLIL::Cell::check()
void RTLIL::Cell::fixup_parameters(bool set_a_signed, bool set_b_signed)
{
if (!type.begins_with("$") || type.begins_with("$_") || type.begins_with("$paramod") || type.begins_with("$fmcombine") ||
type.begins_with("$verific$") || type.begins_with("$array:") || type.begins_with("$extern:"))
std::string type_str = type.str();
std::string_view type_sv = type_str;
if (!type_sv.starts_with("$") || type_sv.starts_with("$_") || type_sv.starts_with("$paramod") || type_sv.starts_with("$fmcombine") ||
type_sv.starts_with("$verific$") || type_sv.starts_with("$array:") || type_sv.starts_with("$extern:"))
return;
if (type == TW($buf) || type == TW($mux) || type == TW($pmux) || type == TW($bmux) || type == TW($bwmux) || type == TW($bweqx)) {

View file

@ -549,7 +549,7 @@ struct RTLIL::IdString
template<typename T> struct compare_ptr_by_name {
bool operator()(const T *a, const T *b) const {
return (a == nullptr || b == nullptr) ? (a < b) : (a->name < b->name);
return (a == nullptr || b == nullptr) ? (a < b) : (a->name.ref() < b->name.ref());
}
};

View file

@ -229,11 +229,33 @@ struct TwinePool {
}
}, (*this)[ref].data);
}
void append_str(TwineRef ref, std::string& out) const {
if (ref == Twine::Null)
return;
if (twine_is_public(ref))
out += '\\';
std::visit([&](const auto& val) {
using T = std::decay_t<decltype(val)>;
if constexpr (std::is_same_v<T, std::monostate>) {
} else if constexpr (std::is_same_v<T, std::string>) {
out += val;
} else if constexpr (std::is_same_v<T, std::vector<TwineRef>>) {
for (size_t i = 0; i < val.size(); ++i) {
if (i > 0)
out += '|';
append_str(val[i], out);
}
} else if constexpr (std::is_same_v<T, Twine::Suffix>) {
append_str(val.prefix, out);
out += val.tail;
}
}, (*this)[ref].data);
}
// Escaped form: leading '\' for public name handles, content otherwise.
std::string str(TwineRef ref) const {
std::ostringstream os;
print(ref, os);
return os.str();
std::string out;
append_str(ref, out);
return out;
}
// Name content without the publicity escape.

View file

@ -663,12 +663,13 @@ void hierarchy_worker(RTLIL::Design *design, std::set<RTLIL::Module*> &used, RTL
log("Used module: %*s%s\n", indent, "", mod->design->twines.str(mod->meta_->name).data());
used.insert(mod);
TwineSearch search(&design->twines);
for (auto cell : mod->cells()) {
std::string celltype = cell->type.str();
if (celltype.compare(0, strlen("$array:"), "$array:") == 0)
celltype = basic_cell_type(celltype);
if (RTLIL::Module *cm = design->module(search.find(celltype)))
RTLIL::Module *cm;
if (cell->type.begins_with("$array:"))
cm = design->module(design->twines.find(basic_cell_type(cell->type.str())));
else
cm = design->module(cell->type.ref());
if (cm)
hierarchy_worker(design, used, cm, indent+4);
}
}

View file

@ -22,6 +22,7 @@
#include "kernel/sigtools.h"
#include "kernel/celltypes.h"
#include "kernel/newcelltypes.h"
#include "kernel/twine.h"
#include "kernel/utils.h"
#include "kernel/log.h"
#include "kernel/unstable/patch.h"
@ -385,7 +386,7 @@ void handle_polarity_inv(Cell *cell, TwineRef port, IdString param, const SigMap
SigBit sig = assign_map(raw);
if (auto inv_a = get_inverted_raw(sig)) {
SigBit new_sig = assign_map(*inv_a);
auto twines = cell->module->design->twines;
auto& twines = cell->module->design->twines;
log_debug("Inverting %s of %s cell `%s' in module `%s': %s -> %s\n",
twines.unescaped_str(port), cell->type.unescaped(), cell, cell->module,
log_signal(sig), log_signal(new_sig));
@ -397,7 +398,9 @@ void handle_polarity_inv(Cell *cell, TwineRef port, IdString param, const SigMap
void handle_clkpol_celltype_swap(Cell *cell, string type1, string type2, TwineRef port, const SigMap &assign_map)
{
log_assert(GetSize(type1) == GetSize(type2));
string cell_type = cell->type.str();
if ((size_t)cell->type_impl > STATIC_TWINE_END)
return;
const std::string &cell_type = TwinePool::globals_[(size_t)cell->type_impl].leaf();
if (GetSize(type1) != GetSize(cell_type))
return;
@ -414,7 +417,7 @@ void handle_clkpol_celltype_swap(Cell *cell, string type1, string type2, TwineRe
if (cell->type.in(type1, type2)) {
SigSpec sig = assign_map(cell->getPort(port));
auto twines = cell->module->design->twines;
auto& twines = cell->module->design->twines;
if (auto inv_a = get_inverted_raw(sig)) {
SigSpec new_sig = assign_map(*inv_a);
log_debug("Inverting %s of %s cell `%s' in module `%s': %s -> %s\n",