3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-04-20 07:36:39 +00:00

celltypes: Extra type props

Now with `is_internal`, `is_metainfo`, and `has_effects`.
Each type property has a comment specifying usage/meaning.
Type properties (sans `is_internal`) get a default value of false.
`CellTypes::setup_*_type()` methods get their own `CellType` struct assignments with named fields being assigned true to improve readability.
This commit is contained in:
Krystine Sherwin 2025-02-25 13:40:51 +13:00
parent d613913905
commit 647ea922f1
No known key found for this signature in database

View file

@ -28,11 +28,25 @@ struct CellType
{
RTLIL::IdString type;
pool<RTLIL::IdString> inputs, outputs;
bool is_evaluable;
bool is_combinatorial;
bool is_synthesizable;
bool is_builtin_ff;
bool is_formal;
// Cell is defined in celltypes.h, as opposed to design-specific
bool is_internal;
// Cell can be handled by CellTypes::eval()
bool is_evaluable = false;
// Cell has no state; outputs are determined solely by inputs
bool is_combinatorial = false;
// Cell is able to be fully represented in the synthesizable subset of verilog
bool is_synthesizable = false;
// Cell is built-in memory logic, includes flip-flops and latches, but not complex
// cells like $mem
bool is_builtin_ff = false;
// Cell is non-synthesizable, but used for formal verification
bool is_formal = false;
// Cell is intended for internal Yosys use, containing informational metadata and
// shouldn't be automatically cleaned; currently only used for $scopeinfo
bool is_metainfo = false;
// Non-synthesizable cell with effects that mean it shouldn't be automatically
// cleaned, e.g. $print
bool has_effects = false;
};
struct CellTypes
@ -60,30 +74,102 @@ struct CellTypes
setup_stdcells_mem();
}
void setup_type(RTLIL::IdString type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs,
bool is_evaluable = false, bool is_combinatorial = false, bool is_synthesizable = false,
bool is_builtin_ff = false, bool is_formal = false)
void setup_type(RTLIL::IdString type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs)
{
CellType ct = {type, inputs, outputs, is_evaluable, is_combinatorial, is_synthesizable, is_builtin_ff, is_formal};
CellType ct = {
.type = type,
.inputs = inputs,
.outputs = outputs,
.is_internal = false
};
cell_types[ct.type] = ct;
}
// Setup combinational cell type which is evaluable and synthesizable
void setup_comb_type(RTLIL::IdString type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs)
// Setup internal cell type with no other default properties
void setup_internal_type(RTLIL::IdString type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs,
bool is_combinatorial = false)
{
setup_type(type, inputs, outputs, true, true, true, false, false);
CellType ct = {
.type = type,
.inputs = inputs,
.outputs = outputs,
.is_internal = true,
.is_combinatorial = is_combinatorial,
};
cell_types[ct.type] = ct;
}
// Setup combinatorial cell type which is synthesizable and evaluable (by default)
void setup_comb_type(RTLIL::IdString type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs,
bool is_evaluable = true)
{
CellType ct = {
.type = type,
.inputs = inputs,
.outputs = outputs,
.is_internal = true,
.is_evaluable = is_evaluable,
.is_combinatorial = true,
.is_synthesizable = true,
};
cell_types[ct.type] = ct;
}
// Setup builtin ff cell type which is synthesizable
void setup_ff_type(RTLIL::IdString type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs)
{
setup_type(type, inputs, outputs, false, false, true, true, false);
CellType ct = {
.type = type,
.inputs = inputs,
.outputs = outputs,
.is_internal = true,
.is_synthesizable = true,
.is_builtin_ff = true,
};
cell_types[ct.type] = ct;
}
// Setup formal cell type which may be evaluable
void setup_formal_type(RTLIL::IdString type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs, bool is_evaluable = false)
// Setup formal cell type which may be combinatorial, and may have effects
void setup_formal_type(RTLIL::IdString type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs,
bool is_combinatorial = false)
{
setup_type(type, inputs, outputs, is_evaluable, false, false, false, true);
CellType ct = {
.type = type,
.inputs = inputs,
.outputs = outputs,
.is_internal = true,
.is_combinatorial = is_combinatorial,
.is_formal = true,
};
cell_types[ct.type] = ct;
}
// Setup cell type which has effects, and may be formal
void setup_effects_type(RTLIL::IdString type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs,
bool is_formal = false)
{
CellType ct = {
.type = type,
.inputs = inputs,
.outputs = outputs,
.is_internal = true,
.is_formal = is_formal,
.has_effects = true,
};
cell_types[ct.type] = ct;
}
// Setup meta-info cell type
void setup_metainfo_type(RTLIL::IdString type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs)
{
CellType ct = {
.type = type,
.inputs = inputs,
.outputs = outputs,
.is_internal = true,
.is_metainfo = true,
};
cell_types[ct.type] = ct;
}
void setup_module(RTLIL::Module *module)
@ -109,9 +195,10 @@ struct CellTypes
{
setup_internals_eval();
setup_comb_type(ID($tribuf), {ID::A, ID::EN}, {ID::Y});
// synthesizable
setup_comb_type(ID($tribuf), {ID::A, ID::EN}, {ID::Y}, false);
// evaluable formal
// combinatorial formal
setup_formal_type(ID($assert), {ID::A, ID::EN}, pool<RTLIL::IdString>(), true);
setup_formal_type(ID($assume), {ID::A, ID::EN}, pool<RTLIL::IdString>(), true);
setup_formal_type(ID($live), {ID::A, ID::EN}, pool<RTLIL::IdString>(), true);
@ -124,22 +211,24 @@ struct CellTypes
setup_formal_type(ID($allseq), pool<RTLIL::IdString>(), {ID::Y}, true);
setup_formal_type(ID($equiv), {ID::A, ID::B}, {ID::Y}, true);
// evaluable non-formal
setup_type(ID($specify2), {ID::EN, ID::SRC, ID::DST}, pool<RTLIL::IdString>(), true);
setup_type(ID($specify3), {ID::EN, ID::SRC, ID::DST, ID::DAT}, pool<RTLIL::IdString>(), true);
setup_type(ID($specrule), {ID::EN_SRC, ID::EN_DST, ID::SRC, ID::DST}, pool<RTLIL::IdString>(), true);
setup_type(ID($print), {ID::EN, ID::ARGS, ID::TRG}, pool<RTLIL::IdString>());
// combinatorial non-synthesizable
setup_internal_type(ID($specify2), {ID::EN, ID::SRC, ID::DST}, pool<RTLIL::IdString>(), true);
setup_internal_type(ID($specify3), {ID::EN, ID::SRC, ID::DST, ID::DAT}, pool<RTLIL::IdString>(), true);
setup_internal_type(ID($specrule), {ID::EN_SRC, ID::EN_DST, ID::SRC, ID::DST}, pool<RTLIL::IdString>(), true);
// non-evaluable formal
setup_formal_type(ID($check), {ID::A, ID::EN, ID::ARGS, ID::TRG}, pool<RTLIL::IdString>());
// non-combinatorial formal
setup_formal_type(ID($set_tag), {ID::A, ID::SET, ID::CLR}, {ID::Y});
setup_formal_type(ID($get_tag), {ID::A}, {ID::Y});
setup_formal_type(ID($overwrite_tag), {ID::A, ID::SET, ID::CLR}, pool<RTLIL::IdString>());
setup_formal_type(ID($original_tag), {ID::A}, {ID::Y});
setup_formal_type(ID($future_ff), {ID::A}, {ID::Y});
// non-evaluable non-formal
setup_type(ID($scopeinfo), {}, {});
// has effects
setup_effects_type(ID($print), {ID::EN, ID::ARGS, ID::TRG}, pool<RTLIL::IdString>());
setup_effects_type(ID($check), {ID::A, ID::EN, ID::ARGS, ID::TRG}, pool<RTLIL::IdString>(), true);
// meta-info
setup_metainfo_type(ID($scopeinfo), {}, {});
}
void setup_internals_eval()
@ -205,23 +294,23 @@ struct CellTypes
{
setup_internals_ff();
setup_type(ID($memrd), {ID::CLK, ID::EN, ID::ADDR}, {ID::DATA});
setup_type(ID($memrd_v2), {ID::CLK, ID::EN, ID::ARST, ID::SRST, ID::ADDR}, {ID::DATA});
setup_type(ID($memwr), {ID::CLK, ID::EN, ID::ADDR, ID::DATA}, pool<RTLIL::IdString>());
setup_type(ID($memwr_v2), {ID::CLK, ID::EN, ID::ADDR, ID::DATA}, pool<RTLIL::IdString>());
setup_type(ID($meminit), {ID::ADDR, ID::DATA}, pool<RTLIL::IdString>());
setup_type(ID($meminit_v2), {ID::ADDR, ID::DATA, ID::EN}, pool<RTLIL::IdString>());
setup_type(ID($mem), {ID::RD_CLK, ID::RD_EN, ID::RD_ADDR, ID::WR_CLK, ID::WR_EN, ID::WR_ADDR, ID::WR_DATA}, {ID::RD_DATA});
setup_type(ID($mem_v2), {ID::RD_CLK, ID::RD_EN, ID::RD_ARST, ID::RD_SRST, ID::RD_ADDR, ID::WR_CLK, ID::WR_EN, ID::WR_ADDR, ID::WR_DATA}, {ID::RD_DATA});
setup_internal_type(ID($memrd), {ID::CLK, ID::EN, ID::ADDR}, {ID::DATA});
setup_internal_type(ID($memrd_v2), {ID::CLK, ID::EN, ID::ARST, ID::SRST, ID::ADDR}, {ID::DATA});
setup_internal_type(ID($memwr), {ID::CLK, ID::EN, ID::ADDR, ID::DATA}, pool<RTLIL::IdString>());
setup_internal_type(ID($memwr_v2), {ID::CLK, ID::EN, ID::ADDR, ID::DATA}, pool<RTLIL::IdString>());
setup_internal_type(ID($meminit), {ID::ADDR, ID::DATA}, pool<RTLIL::IdString>());
setup_internal_type(ID($meminit_v2), {ID::ADDR, ID::DATA, ID::EN}, pool<RTLIL::IdString>());
setup_internal_type(ID($mem), {ID::RD_CLK, ID::RD_EN, ID::RD_ADDR, ID::WR_CLK, ID::WR_EN, ID::WR_ADDR, ID::WR_DATA}, {ID::RD_DATA});
setup_internal_type(ID($mem_v2), {ID::RD_CLK, ID::RD_EN, ID::RD_ARST, ID::RD_SRST, ID::RD_ADDR, ID::WR_CLK, ID::WR_EN, ID::WR_ADDR, ID::WR_DATA}, {ID::RD_DATA});
setup_type(ID($fsm), {ID::CLK, ID::ARST, ID::CTRL_IN}, {ID::CTRL_OUT});
setup_internal_type(ID($fsm), {ID::CLK, ID::ARST, ID::CTRL_IN}, {ID::CTRL_OUT});
}
void setup_stdcells()
{
setup_stdcells_eval();
setup_comb_type(ID($_TBUF_), {ID::A, ID::E}, {ID::Y});
setup_comb_type(ID($_TBUF_), {ID::A, ID::E}, {ID::Y}, false);
}
void setup_stdcells_eval()