3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-07-21 11:52:07 +00:00

libparse: add LibertyExpression::str for testing

This commit is contained in:
Emil J. Tywoniak 2025-07-11 18:27:19 +02:00
parent 6ee01308f2
commit 4b1a8a3b66
2 changed files with 42 additions and 0 deletions

View file

@ -117,6 +117,7 @@ static bool parse_next_state(const LibertyAst *cell, const LibertyAst *attr, std
// the next_state variable isn't just a pin name; perhaps this is an enable? // the next_state variable isn't just a pin name; perhaps this is an enable?
auto helper = LibertyExpression::Lexer(expr); auto helper = LibertyExpression::Lexer(expr);
auto tree = LibertyExpression::parse(helper); auto tree = LibertyExpression::parse(helper);
log_debug("liberty expression:\n%s\n", tree.str().c_str());
if (tree.kind == LibertyExpression::Kind::EMPTY) { if (tree.kind == LibertyExpression::Kind::EMPTY) {
if (!warned_cells.count(cell_name)) { if (!warned_cells.count(cell_name)) {

View file

@ -306,6 +306,47 @@ bool LibertyExpression::eval(dict<std::string, bool>& values) {
} }
return false; return false;
} }
std::string LibertyExpression::str(int indent)
{
std::string prefix;
prefix = std::string(indent, ' ');
switch (kind) {
case AND:
prefix += "(and ";
break;
case OR:
prefix += "(or ";
break;
case NOT:
prefix += "(not ";
break;
case XOR:
prefix += "(xor ";
break;
case PIN:
prefix += "(pin \"" + name + "\"";
break;
case EMPTY:
prefix += "(";
break;
default:
log_assert(false);
}
size_t add_indent = prefix.length();
bool first = true;
for (auto child : children) {
if (!first) {
prefix += "\n" + child.str(indent + add_indent);
} else {
prefix += child.str(0);
}
first = false;
}
prefix += ")";
return prefix;
}
#endif #endif
int LibertyParser::lexer(std::string &str) int LibertyParser::lexer(std::string &str)