| #include "get_pins.h" |
| |
| USING_YOSYS_NAMESPACE |
| |
| std::string GetPins::TypeName() { return "pin"; } |
| |
| std::string GetPins::SelectionType() { return "c"; } |
| |
| void GetPins::execute(std::vector<std::string> args, RTLIL::Design* design) { |
| if (design->top_module() == nullptr) { |
| log_cmd_error("No top module detected\n"); |
| } |
| |
| CommandArgs parsed_args(ParseCommand(args)); |
| Tcl_Obj* tcl_list = Tcl_NewListObj(0, NULL); |
| for (auto obj : parsed_args.selection_objects) { |
| size_t port_separator = obj.find_last_of("/"); |
| std::string cell = obj.substr(0, port_separator); |
| std::string port = obj.substr(port_separator + 1); |
| SelectionObjects selection{RTLIL::unescape_id(design->top_module()->name) + "/" + |
| SelectionType() + ":" + cell}; |
| extra_args(selection, 0, design); |
| ExtractSingleSelection(tcl_list, design, port, parsed_args); |
| } |
| if (!parsed_args.is_quiet) { |
| log("\n"); |
| } |
| Tcl_SetObjResult(yosys_get_tcl_interp(), tcl_list); |
| } |
| |
| GetPins::SelectionObjects GetPins::ExtractSelection(RTLIL::Design* design, const CommandArgs& args) { |
| return SelectionObjects(); |
| } |
| |
| void GetPins::ExtractSingleSelection(Tcl_Obj* tcl_list, RTLIL::Design* design, |
| const std::string& port_name, |
| const CommandArgs& args) { |
| if (design->selected_modules().empty()) { |
| if (!args.is_quiet) { |
| log_warning("Specified %s not found in design\n", |
| TypeName().c_str()); |
| } |
| } |
| for (auto module : design->selected_modules()) { |
| for (auto cell : module->selected_cells()) { |
| if (!cell->hasPort(RTLIL::escape_id(port_name))) { |
| continue; |
| } |
| if (args.filters.size() > 0) { |
| Filter filter = args.filters.at(0); |
| std::string attr_value = cell->get_string_attribute( |
| RTLIL::IdString(RTLIL::escape_id(filter.first))); |
| if (attr_value.compare(filter.second)) { |
| continue; |
| } |
| } |
| std::string pin_name(RTLIL::unescape_id(cell->name) + "/" + port_name); |
| if (!args.is_quiet) { |
| log("%s ", pin_name.c_str()); |
| } |
| Tcl_Obj* value_obj = Tcl_NewStringObj(pin_name.c_str(), -1); |
| Tcl_ListObjAppendElement(yosys_get_tcl_interp(), tcl_list, |
| value_obj); |
| } |
| } |
| } |
| |