3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-10-09 17:31:59 +00:00

sdc: graph mode only

This commit is contained in:
Emil J. Tywoniak 2025-10-07 16:41:31 +02:00
parent 153132d1e9
commit 9779c9673f

View file

@ -90,12 +90,6 @@ struct SdcObjects {
// constraint-side tracking // constraint-side tracking
FullConstraint, FullConstraint,
} collect_mode; } collect_mode;
enum ValueMode {
// return something sensible and error on unknown
Normal,
// return a new graph node assuming unknown is overridden
Graph,
} value_mode;
using CellPin = std::pair<Cell*, IdString>; using CellPin = std::pair<Cell*, IdString>;
Design* design; Design* design;
std::vector<std::pair<std::string, Wire*>> design_ports; std::vector<std::pair<std::string, Wire*>> design_ports;
@ -522,16 +516,11 @@ find_matching(U objects, const MatchConfig& config, const std::vector<std::strin
} }
return resolved; return resolved;
} }
struct GetterOpts {
bool hierarchical_flag = false; struct TclOpts {
bool regexp_flag = false;
bool nocase_flag = false;
std::string separator = "/";
Tcl_Obj* of_objects = nullptr;
std::vector<std::string> patterns = {};
std::initializer_list<const char*> legals;
const char* name; const char* name;
GetterOpts(const char* name, std::initializer_list<const char*> legals) : legals(legals), name(name) {} std::initializer_list<const char*> legals;
TclOpts(const char* name, std::initializer_list<const char*> legals) : name(name), legals(legals) {}
bool parse_opt(Tcl_Obj* obj, const char* opt_name) { bool parse_opt(Tcl_Obj* obj, const char* opt_name) {
char* arg = Tcl_GetString(obj); char* arg = Tcl_GetString(obj);
std::string expected = std::string("-") + opt_name; std::string expected = std::string("-") + opt_name;
@ -543,6 +532,16 @@ struct GetterOpts {
} }
return false; return false;
} }
};
struct GetterOpts : TclOpts {
bool hierarchical_flag = false;
bool regexp_flag = false;
bool nocase_flag = false;
std::string separator = "/";
Tcl_Obj* of_objects = nullptr;
std::vector<std::string> patterns = {};
GetterOpts(const char* name, std::initializer_list<const char*> legals) : TclOpts(name, legals) {}
template<typename T> template<typename T>
bool parse_flag(Tcl_Obj* obj, const char* flag_name, T& flag_var) { bool parse_flag(Tcl_Obj* obj, const char* flag_name, T& flag_var) {
bool ret = parse_opt(obj, flag_name); bool ret = parse_opt(obj, flag_name);
@ -617,28 +616,7 @@ static int sdc_get_pins_cmd(ClientData data, Tcl_Interp *interp, int objc, Tcl_O
const auto& pins = objects->design_pins; const auto& pins = objects->design_pins;
resolved = find_matching<SdcObjects::CellPin, decltype(pins)>(pins, config, opts.patterns, "pin"); resolved = find_matching<SdcObjects::CellPin, decltype(pins)>(pins, config, opts.patterns, "pin");
Tcl_Obj *result = nullptr; return graph_node(TclCall{interp, objc, objv});
if (objects->value_mode == SdcObjects::ValueMode::Normal) {
log_error("TODO normal\n");
auto width = [](SdcObjects::CellPin& pin) -> size_t {
return (size_t)pin.first->getPort(pin.second).size();
};
objects->build_normal_result<SdcObjects::CellPin, decltype(objects->resolved_pin_pattern_sets)>(interp, std::move(resolved), objects->resolved_pin_pattern_sets, width, result);
} else if (objects->value_mode == SdcObjects::ValueMode::Graph)
return graph_node(TclCall{interp, objc, objv});
if (objects->collect_mode != SdcObjects::CollectMode::FullConstraint)
objects->merge_as_constrained(std::move(resolved));
// merge_or_init(std::make_pair(name, pin), objects->constrained_pins, matching_bits);
// TODO
// }
// return objects->graph_node(interp, objc, objv, std::move(resolved), objects->resolved_pin_pattern_sets);
if (result)
Tcl_SetObjResult(interp, result);
return TCL_OK;
} }
static int sdc_get_ports_cmd(ClientData data, Tcl_Interp *interp, int objc, Tcl_Obj* const objv[]) static int sdc_get_ports_cmd(ClientData data, Tcl_Interp *interp, int objc, Tcl_Obj* const objv[])
@ -654,23 +632,12 @@ static int sdc_get_ports_cmd(ClientData data, Tcl_Interp *interp, int objc, Tcl_
const auto& ports = objects->design_ports; const auto& ports = objects->design_ports;
resolved = find_matching<Wire*, decltype(ports)>(ports, config, opts.patterns, "port"); resolved = find_matching<Wire*, decltype(ports)>(ports, config, opts.patterns, "port");
Tcl_Obj *result = nullptr;
for (auto [name, wire, matching_bits] : resolved) { for (auto [name, wire, matching_bits] : resolved) {
if (objects->value_mode == SdcObjects::ValueMode::Normal)
log_error("TODO normal\n");
// objects->build_normal_result(interp, resolved.size(), wire->width, name, result, matching_bits);
if (objects->collect_mode != SdcObjects::CollectMode::FullConstraint) if (objects->collect_mode != SdcObjects::CollectMode::FullConstraint)
merge_or_init(std::make_pair(name, wire), objects->constrained_ports, matching_bits); merge_or_init(std::make_pair(name, wire), objects->constrained_ports, matching_bits);
} }
if (objects->value_mode == SdcObjects::ValueMode::Graph) { return graph_node(TclCall{interp, objc, objv});
return graph_node(TclCall{interp, objc, objv});
// return objects->graph_node(interp, objc, objv, std::move(resolved), objects->resolved_port_pattern_sets);
}
if (result)
Tcl_SetObjResult(interp, result);
return TCL_OK;
} }
static int sdc_get_nets_cmd(ClientData data, Tcl_Interp *interp, int objc, Tcl_Obj* const objv[]) static int sdc_get_nets_cmd(ClientData data, Tcl_Interp *interp, int objc, Tcl_Obj* const objv[])
@ -686,23 +653,12 @@ static int sdc_get_nets_cmd(ClientData data, Tcl_Interp *interp, int objc, Tcl_O
const auto& ports = objects->design_nets; const auto& ports = objects->design_nets;
resolved = find_matching<Wire*, decltype(ports)>(ports, config, opts.patterns, "net"); resolved = find_matching<Wire*, decltype(ports)>(ports, config, opts.patterns, "net");
Tcl_Obj *result = nullptr;
for (auto [name, wire, matching_bits] : resolved) { for (auto [name, wire, matching_bits] : resolved) {
if (objects->value_mode == SdcObjects::ValueMode::Normal)
log_error("TODO normal\n");
// objects->build_normal_result(interp, resolved.size(), wire->width, name, result, matching_bits);
if (objects->collect_mode != SdcObjects::CollectMode::FullConstraint) if (objects->collect_mode != SdcObjects::CollectMode::FullConstraint)
merge_or_init(std::make_pair(name, wire), objects->constrained_nets, matching_bits); merge_or_init(std::make_pair(name, wire), objects->constrained_nets, matching_bits);
} }
if (objects->value_mode == SdcObjects::ValueMode::Graph) { return graph_node(TclCall{interp, objc, objv});
return graph_node(TclCall{interp, objc, objv});
// return objects->graph_node(interp, objc, objv, std::move(resolved), objects->resolved_port_pattern_sets);
}
if (result)
Tcl_SetObjResult(interp, result);
return TCL_OK;
} }
std::optional<std::tuple<std::string, std::string>> split_at(std::string s) std::optional<std::tuple<std::string, std::string>> split_at(std::string s)
@ -807,7 +763,6 @@ public:
objects = std::make_unique<SdcObjects>(design); objects = std::make_unique<SdcObjects>(design);
objects->collect_mode = SdcObjects::CollectMode::SimpleGetter; objects->collect_mode = SdcObjects::CollectMode::SimpleGetter;
objects->value_mode = SdcObjects::ValueMode::Graph;
Tcl_CreateObjCommand(interp, "get_pins", sdc_get_pins_cmd, (ClientData) objects.get(), NULL); Tcl_CreateObjCommand(interp, "get_pins", sdc_get_pins_cmd, (ClientData) objects.get(), NULL);
Tcl_CreateObjCommand(interp, "get_nets", sdc_get_nets_cmd, (ClientData) objects.get(), NULL); Tcl_CreateObjCommand(interp, "get_nets", sdc_get_nets_cmd, (ClientData) objects.get(), NULL);
Tcl_CreateObjCommand(interp, "get_ports", sdc_get_ports_cmd, (ClientData) objects.get(), NULL); Tcl_CreateObjCommand(interp, "get_ports", sdc_get_ports_cmd, (ClientData) objects.get(), NULL);
@ -823,17 +778,17 @@ struct SdcPass : public Pass {
void execute(std::vector<std::string> args, RTLIL::Design *design) override { void execute(std::vector<std::string> args, RTLIL::Design *design) override {
log_header(design, "Executing SDC pass.\n"); log_header(design, "Executing SDC pass.\n");
size_t argidx; size_t argidx;
bool graph_mode = false;
bool dump_mode = false; bool dump_mode = false;
bool dump_graph_mode = false;
bool keep_hierarchy_mode = false; bool keep_hierarchy_mode = false;
std::vector<std::string> opensta_stubs_paths; std::vector<std::string> opensta_stubs_paths;
for (argidx = 1; argidx < args.size(); argidx++) { for (argidx = 1; argidx < args.size(); argidx++) {
if (args[argidx] == "-graph") { if (args[argidx] == "-dump") {
graph_mode = true;
continue;
} else if (args[argidx] == "-dump") {
dump_mode = true; dump_mode = true;
continue; continue;
} else if (args[argidx] == "-dump-graph") {
dump_graph_mode = true;
continue;
} else if (args[argidx] == "-keep_hierarchy") { } else if (args[argidx] == "-keep_hierarchy") {
keep_hierarchy_mode = true; keep_hierarchy_mode = true;
continue; continue;
@ -863,7 +818,7 @@ struct SdcPass : public Pass {
sdc.objects->dump(); sdc.objects->dump();
if (keep_hierarchy_mode) if (keep_hierarchy_mode)
sdc.objects->keep_hierarchy(); sdc.objects->keep_hierarchy();
inspect_globals(interp, graph_mode); inspect_globals(interp, dump_graph_mode);
Tcl_Release(interp); Tcl_Release(interp);
} }
} SdcPass; } SdcPass;