まずはYosysに簡単なPassを作ってみる。モジュール内の配線やセルをリストアップしてみよう。
search_wires()
とsearch_cells()
を作って、モジュール内の配線などを出力してみる。
void search_wires (RTLIL::Module* module) { log(" Wires :\n"); // auto wires = module->selected_wires(); auto wires = module->wires(); for (auto iter = wires.begin(); iter != wires.end(); iter++) { log(" Name = %s, width = %d, start_offset = %d\n", (*iter)->name.c_str(), (*iter)->width, (*iter)->start_offset ); } } void search_cells (RTLIL::Module* module) { log(" Cells :\n"); auto wires = module->cells(); for (auto iter = wires.begin(); iter != wires.end(); iter++) { log(" Name = %s\n", (*iter)->name.c_str()); } }
こうすると、以下のようにリストアップできる。
Wires : Name = $add$adder.sv:48$3_Y, width = 32, start_offset = 0 Name = $mul$adder.sv:44$2_Y, width = 32, start_offset = 0 Name = $0\temp[31:0], width = 32, start_offset = 0 Name = \temp, width = 32, start_offset = 0 Name = \out, width = 32, start_offset = 32 Name = \in2, width = 32, start_offset = 0 Name = \in1, width = 32, start_offset = 0 Name = \in0, width = 32, start_offset = 0 Name = \reset, width = 1, start_offset = 0 Name = \clk, width = 1, start_offset = 0 Cells : Name = $add$adder.sv:48$3 Name = $mul$adder.sv:44$2
次に、Module内の接続について見てみる。これにはconnections()
を使う。これま主にモジュールの出力の接続について見るものらしい。
void search_connections (RTLIL::Module* module) { log(" Connections :\n"); auto conn = module->connections(); for (auto iter = conn.begin(); iter != conn.end(); iter++) { log(" %s -> %s\n", (*iter).first.as_chunk().wire->name.c_str(), (*iter).second.as_chunk().wire->name.c_str()); } }
これをこれにより、出力ポートの接続を確認することができる。
Connections : \out <- $add$adder.sv:48$3_Y
なんとなく分かってきた。