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:
parent
153132d1e9
commit
9779c9673f
1 changed files with 23 additions and 68 deletions
|
@ -90,12 +90,6 @@ struct SdcObjects {
|
|||
// constraint-side tracking
|
||||
FullConstraint,
|
||||
} 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>;
|
||||
Design* design;
|
||||
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;
|
||||
}
|
||||
struct GetterOpts {
|
||||
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 = {};
|
||||
std::initializer_list<const char*> legals;
|
||||
|
||||
struct TclOpts {
|
||||
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) {
|
||||
char* arg = Tcl_GetString(obj);
|
||||
std::string expected = std::string("-") + opt_name;
|
||||
|
@ -543,6 +532,16 @@ struct GetterOpts {
|
|||
}
|
||||
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>
|
||||
bool parse_flag(Tcl_Obj* obj, const char* flag_name, T& flag_var) {
|
||||
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;
|
||||
resolved = find_matching<SdcObjects::CellPin, decltype(pins)>(pins, config, opts.patterns, "pin");
|
||||
|
||||
Tcl_Obj *result = nullptr;
|
||||
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[])
|
||||
|
@ -654,23 +632,12 @@ static int sdc_get_ports_cmd(ClientData data, Tcl_Interp *interp, int objc, Tcl_
|
|||
const auto& ports = objects->design_ports;
|
||||
resolved = find_matching<Wire*, decltype(ports)>(ports, config, opts.patterns, "port");
|
||||
|
||||
Tcl_Obj *result = nullptr;
|
||||
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)
|
||||
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 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[])
|
||||
|
@ -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;
|
||||
resolved = find_matching<Wire*, decltype(ports)>(ports, config, opts.patterns, "net");
|
||||
|
||||
Tcl_Obj *result = nullptr;
|
||||
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)
|
||||
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 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)
|
||||
|
@ -807,7 +763,6 @@ public:
|
|||
|
||||
objects = std::make_unique<SdcObjects>(design);
|
||||
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_nets", sdc_get_nets_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 {
|
||||
log_header(design, "Executing SDC pass.\n");
|
||||
size_t argidx;
|
||||
bool graph_mode = false;
|
||||
bool dump_mode = false;
|
||||
bool dump_graph_mode = false;
|
||||
bool keep_hierarchy_mode = false;
|
||||
std::vector<std::string> opensta_stubs_paths;
|
||||
for (argidx = 1; argidx < args.size(); argidx++) {
|
||||
if (args[argidx] == "-graph") {
|
||||
graph_mode = true;
|
||||
continue;
|
||||
} else if (args[argidx] == "-dump") {
|
||||
if (args[argidx] == "-dump") {
|
||||
dump_mode = true;
|
||||
continue;
|
||||
} else if (args[argidx] == "-dump-graph") {
|
||||
dump_graph_mode = true;
|
||||
continue;
|
||||
} else if (args[argidx] == "-keep_hierarchy") {
|
||||
keep_hierarchy_mode = true;
|
||||
continue;
|
||||
|
@ -863,7 +818,7 @@ struct SdcPass : public Pass {
|
|||
sdc.objects->dump();
|
||||
if (keep_hierarchy_mode)
|
||||
sdc.objects->keep_hierarchy();
|
||||
inspect_globals(interp, graph_mode);
|
||||
inspect_globals(interp, dump_graph_mode);
|
||||
Tcl_Release(interp);
|
||||
}
|
||||
} SdcPass;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue