| 135 | |
| 136 | bool HexagonControlWrapper::Finalize() { return soc_interface_Finalize(); } |
| 137 | bool HexagonControlWrapper::SetupGraph() { |
| 138 | // Copy graph transfer info to modify to adapt hexnn library |
| 139 | GraphTransferInfo& graph_transfer_info = |
| 140 | graph_transferer_.GetMutableGraphTransferInfo(); |
| 141 | |
| 142 | // Overwrite op type of input nodes for hexagon |
| 143 | for (const GraphTransferGraphInputNodeInfo& graph_input : |
| 144 | graph_transfer_info.graph_input_node_info()) { |
| 145 | GraphTransferNodeInfo* node_info = |
| 146 | FindNodeInfo(graph_input.name(), &graph_transfer_info); |
| 147 | CHECK_NE(node_info, nullptr); |
| 148 | } |
| 149 | |
| 150 | // Generate a new output node which is connected to graph output node |
| 151 | // TODO(satok): Support multiple output nodes |
| 152 | CHECK_EQ(graph_transfer_info.graph_output_node_info_size(), 1); |
| 153 | for (const GraphTransferGraphOutputNodeInfo& graph_output : |
| 154 | graph_transfer_info.graph_output_node_info()) { |
| 155 | const int new_output_node_id = graph_transfer_info.node_info_size() + |
| 156 | graph_transfer_info.const_node_info_size() + |
| 157 | 2 /* offset for ids */; |
| 158 | // Register a new output node |
| 159 | GraphTransferNodeInfo& new_output_node_info = |
| 160 | *graph_transfer_info.add_node_info(); |
| 161 | new_output_node_info.set_name(OUTPUT_OP_NAME); |
| 162 | new_output_node_info.set_node_id(new_output_node_id); |
| 163 | new_output_node_info.set_type_name(OUTPUT_OP_NAME); |
| 164 | new_output_node_info.set_soc_op_id( |
| 165 | HexagonOpsDefinitions::getInstance().GetOpIdFor(OUTPUT_OP_NAME, {})); |
| 166 | new_output_node_info.set_padding_id(0 /* PADDING_NA_ID */); |
| 167 | new_output_node_info.set_input_count(1); |
| 168 | new_output_node_info.set_output_count(0); |
| 169 | |
| 170 | const TensorId tid = ParseTensorName(graph_output.name()); |
| 171 | const string node_name(tid.first); |
| 172 | const int port = tid.second; |
| 173 | // Register node input for the new output node |
| 174 | const GraphTransferNodeInfo* node_info = |
| 175 | FindNodeInfo(node_name, &graph_transfer_info); |
| 176 | CHECK_NE(node_info, nullptr); |
| 177 | GraphTransferNodeInputInfo& node_input_info = |
| 178 | *graph_transfer_info.add_node_input_info(); |
| 179 | node_input_info.set_node_id(new_output_node_id); |
| 180 | GraphTransferNodeInput& node_input = *node_input_info.add_node_input(); |
| 181 | node_input.set_node_id(node_info->node_id()); |
| 182 | node_input.set_output_port(port); |
| 183 | } |
| 184 | |
| 185 | if (DBG_DUMP_VERIFICATION_STRING) { |
| 186 | GraphTransferer gt; |
| 187 | gt.SetSerializedGraphTransferInfo(graph_transfer_info.SerializeAsString()); |
| 188 | gt.DumpVerificationStringOfNodeTransferParams(); |
| 189 | } |
| 190 | |
| 191 | int inputs_count = 0; |
| 192 | int outputs_count = 0; |
| 193 | for (const GraphTransferNodeInputInfo& input_params : |
| 194 | graph_transfer_info.node_input_info()) { |