70 std::map<RTLIL::SigBit, std::pair<bool, RTLIL::SigSpec>> extend_map;
73 for (
auto &it : module->
cells_)
82 std::pair<RTLIL::IdString, RTLIL::IdString> key(cell->
type, conn.first);
84 if (!
decls.count(key))
87 portdecl_t &decl =
decls.at(key);
92 if (!decl.signparam.empty() && !cell->
parameters.count(decl.signparam))
95 int inner_width = cell->
parameters.at(decl.widthparam).as_int();
96 int outer_width = conn.second.size();
97 bool is_signed = decl.signparam.empty() ? decl.is_signed : cell->
parameters.at(decl.signparam).as_bool();
99 if (inner_width >= outer_width)
103 extend_map[sig.
extract(inner_width - 1, 1)] = std::pair<bool, RTLIL::SigSpec>(is_signed,
104 sig.
extract(inner_width, outer_width - inner_width));
108 for (
auto &it : module->
cells_)
112 if (!design->
selected(module, cell))
117 std::vector<RTLIL::SigBit> sigbits = sigmap(conn.second).to_sigbit_vector();
120 for (
size_t i = 0; i < sigbits.size(); i++)
122 if (!extend_map.count(sigbits[i]))
125 bool is_signed = extend_map.at(sigbits[i]).first;
128 int extend_width = 0;
130 while (extend_width < extend_sig.
size() && i + extend_width + 1 < sigbits.size() &&
131 sigbits[i + extend_width + 1] == extend_bit) extend_width++;
133 if (extend_width == 0)
136 if (old_sig.
size() == 0)
137 old_sig = conn.second;
bool selected(T1 *module) const
std::set< RTLIL::IdString > decl_celltypes
const char * log_signal(const RTLIL::SigSpec &sig, bool autoint)
std::map< RTLIL::IdString, RTLIL::Const > parameters
std::map< std::pair< RTLIL::IdString, RTLIL::IdString >, portdecl_t > decls
static const char * id2cstr(const RTLIL::IdString &str)
void replace(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec &with)
std::map< RTLIL::IdString, RTLIL::Cell * > cells_
void log(const char *format,...)
RTLIL::SigSpec extract(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec *other=NULL) const
std::map< RTLIL::IdString, RTLIL::SigSpec > connections_
const std::map< RTLIL::IdString, RTLIL::SigSpec > & connections() const