Skip to content

Commit

Permalink
defin: handling errors with definReader::error for scandefs
Browse files Browse the repository at this point in the history
Signed-off-by: Felipe Garay <[email protected]>
  • Loading branch information
fgaray committed Jul 19, 2024
1 parent bec9c2b commit 40e5d0b
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 27 deletions.
59 changes: 34 additions & 25 deletions src/odb/src/defin/definReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,10 @@ dbITerm* findScanITerm(definReader* reader,
{
if (!pin_name) {
if (!common_pin) {
reader->_logger->error(utl::ODB,
259,
"SCANDEF is missing either component pin or a "
"COMMONSCANPINS for instance {}",
inst->getName());
reader->error(
fmt::format("SCANDEF is missing either component pin or a "
"COMMONSCANPINS for instance {}",
inst->getName()));
return nullptr;
}
// using the common pin name
Expand All @@ -113,9 +112,8 @@ dbITerm* findScanITerm(definReader* reader,
return inst->findITerm(pin_name);
}

std::variant<dbBTerm*, dbITerm*> findScanTerm(definReader* reader,
dbBlock* block,
const char* pin_name)
std::optional<std::variant<dbBTerm*, dbITerm*>>
findScanTerm(definReader* reader, dbBlock* block, const char* pin_name)
{
dbBTerm* bterm = block->findBTerm(pin_name);
if (bterm) {
Expand All @@ -126,8 +124,9 @@ std::variant<dbBTerm*, dbITerm*> findScanTerm(definReader* reader,
if (iterm) {
return iterm;
}
reader->_logger->error(
utl::ODB, 262, "SCANDEF START/STOP pin {} does not exist", pin_name);
reader->error(
fmt::format("SCANDEF START/STOP pin {} does not exist", pin_name));
return std::nullopt;
}

void populateScanInst(definReader* reader,
Expand All @@ -141,30 +140,29 @@ void populateScanInst(definReader* reader,
{
dbInst* inst = block->findInst(inst_name);
if (!inst) {
reader->_logger->error(
utl::ODB, 255, "SCANDEF Inst {} does not exist", inst_name);
reader->error(fmt::format("SCANDEF Inst {} does not exist", inst_name));
return;
}

dbScanInst* scan_inst = db_scan_list->add(inst);

dbITerm* scan_in
= findScanITerm(reader, inst, in_pin_name, scan_chain->commonInPin());
if (!scan_in) {
reader->_logger->error(utl::ODB,
256,
"SCANDEF IN pin {} does not exist in cell {}",
in_pin_name,
inst_name);
reader->error(fmt::format(
"SCANDEF IN pin {} does not exist in cell {}", in_pin_name, inst_name));
}

dbITerm* scan_out
= findScanITerm(reader, inst, out_pin_name, scan_chain->commonOutPin());
if (!scan_out) {
reader->_logger->error(utl::ODB,
257,
"SCANDEF OUT pin {} does not exist in cell {}",
out_pin_name,
inst_name);
reader->error(fmt::format("SCANDEF OUT pin {} does not exist in cell {}",
out_pin_name,
inst_name));
}

if (!scan_in || !scan_out) {
return;
}

scan_inst->setAccessPins({.scan_in = scan_in, .scan_out = scan_out});
Expand Down Expand Up @@ -1432,10 +1430,21 @@ int definReader::scanchainsCallback(defrCallbackType_e /* unused: type */,
scan_chain->start(&unused, &start_pin_name);
scan_chain->stop(&unused, &stop_pin_name);

auto scan_in_pin = findScanTerm(reader, block, start_pin_name);
auto scan_out_pin = findScanTerm(reader, block, stop_pin_name);
if (!scan_in_pin.has_value()) {
reader->error(fmt::format("Can't parse SCANIN pin"));
return PARSE_ERROR;
}
if (!scan_out_pin.has_value()) {
reader->error(fmt::format("Can't parse SCANOUT pin"));
return PARSE_ERROR;
}

std::visit([db_scan_chain](auto&& pin) { db_scan_chain->setScanIn(pin); },
findScanTerm(reader, block, start_pin_name));
*scan_in_pin);
std::visit([db_scan_chain](auto&& pin) { db_scan_chain->setScanOut(pin); },
findScanTerm(reader, block, stop_pin_name));
*scan_out_pin);

// Get floating elements, each floating element is in its own dbScanList
int floating_size = 0;
Expand Down Expand Up @@ -1870,7 +1879,7 @@ void definReader::line(int line_num)
_logger->info(utl::ODB, 125, "lines processed: {}", line_num);
}

void definReader::error(const char* msg)
void definReader::error(std::string_view msg)
{
_logger->warn(utl::ODB, 126, "error: {}", msg);
++_errors;
Expand Down
4 changes: 2 additions & 2 deletions src/odb/src/defin/definReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,7 @@ class definReader : public definBase
void init() override;
void setLibs(std::vector<dbLib*>& lib_names);

virtual void error(const char* msg);
virtual void line(int line_num);
void line(int line_num);

void setTech(dbTech* tech);
void setBlock(dbBlock* block);
Expand Down Expand Up @@ -262,6 +261,7 @@ class definReader : public definBase
void useBlockName(const char* name);
void namesAreDBIDs();
void setAssemblyMode();
void error(std::string_view msg);

dbChip* createChip(std::vector<dbLib*>& search_libs,
const char* def_file,
Expand Down

0 comments on commit 40e5d0b

Please sign in to comment.