common: Add some convenience functions for development

This commit is contained in:
Rowan Goemans 2024-09-11 18:35:47 +02:00 committed by myrtle
parent c25da06d03
commit 7aeed52c06
2 changed files with 51 additions and 6 deletions

View File

@ -135,7 +135,7 @@ void logv_nonfatal_error(const char *format, va_list ap)
had_nonfatal_error = true; had_nonfatal_error = true;
} }
void logv_error(const char *format, va_list ap) [[noreturn]] void logv_error(const char *format, va_list ap)
{ {
logv_prefixed("ERROR: ", format, ap, LogLevel::ERROR_MSG); logv_prefixed("ERROR: ", format, ap, LogLevel::ERROR_MSG);
@ -180,7 +180,7 @@ void log_warning(const char *format, ...)
va_end(ap); va_end(ap);
} }
void log_error(const char *format, ...) [[noreturn]] void log_error(const char *format, ...)
{ {
va_list ap; va_list ap;
va_start(ap, format); va_start(ap, format);

View File

@ -30,6 +30,7 @@
#include "archdefs.h" #include "archdefs.h"
#include "hashlib.h" #include "hashlib.h"
#include "indexed_store.h" #include "indexed_store.h"
#include "log.h"
#include "nextpnr_base_types.h" #include "nextpnr_base_types.h"
#include "nextpnr_namespaces.h" #include "nextpnr_namespaces.h"
#include "property.h" #include "property.h"
@ -180,6 +181,20 @@ enum PortType
PORT_INOUT = 2 PORT_INOUT = 2
}; };
[[maybe_unused]] static const std::string portType_to_str(PortType typ)
{
switch (typ) {
case PORT_IN:
return "PORT_IN";
case PORT_OUT:
return "PORT_OUT";
case PORT_INOUT:
return "PORT_INOUT";
default:
log_error("Impossible PortType");
}
}
struct PortInfo struct PortInfo
{ {
IdString name; IdString name;
@ -203,7 +218,7 @@ enum TimingPortClass
TMG_IGNORE, // Asynchronous to all clocks, "don't care", and should be ignored (false path) for analysis TMG_IGNORE, // Asynchronous to all clocks, "don't care", and should be ignored (false path) for analysis
}; };
static std::string tmgPortClass_to_str(TimingPortClass tmg_class) [[maybe_unused]] static const std::string timingPortClass_to_str(TimingPortClass tmg_class)
{ {
switch (tmg_class) { switch (tmg_class) {
case TMG_CLOCK_INPUT: case TMG_CLOCK_INPUT:
@ -225,7 +240,7 @@ static std::string tmgPortClass_to_str(TimingPortClass tmg_class)
case TMG_IGNORE: case TMG_IGNORE:
return "TMG_IGNORE"; return "TMG_IGNORE";
default: default:
return "TMG_BOOM"; log_error("Impossible TimingPortClass");
} }
} }
@ -235,6 +250,18 @@ enum ClockEdge
FALLING_EDGE FALLING_EDGE
}; };
[[maybe_unused]] static const std::string clockEdge_to_str(ClockEdge edge)
{
switch (edge) {
case RISING_EDGE:
return "RISING_EDGE";
case FALLING_EDGE:
return "FALLING_EDGE";
default:
log_error("Impossible ClockEdge");
}
}
struct TimingClockingInfo struct TimingClockingInfo
{ {
IdString clock_port; // Port name of clock domain IdString clock_port; // Port name of clock domain
@ -378,6 +405,24 @@ struct CriticalPath
SETUP // Setup time in sink SETUP // Setup time in sink
}; };
[[maybe_unused]] static const std::string type_to_str(Type typ)
{
switch (typ) {
case Type::CLK_TO_Q:
return "CLK_TO_Q";
case Type::SOURCE:
return "SOURCE";
case Type::LOGIC:
return "LOGIC";
case Type::ROUTING:
return "ROUTING";
case Type::SETUP:
return "SETUP";
default:
log_error("Impossible Segment::Type");
}
}
// Type // Type
Type type; Type type;
// Net name (routing only) // Net name (routing only)
@ -434,8 +479,8 @@ struct TimingResult
// Histogram of slack // Histogram of slack
dict<int, unsigned> slack_histogram; dict<int, unsigned> slack_histogram;
// TODO: Hold time violations // Min delay violations, only hold time for now
// dict<IdString, CriticalPath> hold_violations; std::vector<CriticalPath> min_delay_violations;
}; };
// Represents the contents of a non-leaf cell in a design // Represents the contents of a non-leaf cell in a design