| 409 | } |
| 410 | |
| 411 | std::string dnnc::cppCodeGen::writeUnaryOperator(opNode &computeNode, |
| 412 | std::vector<node *> &ins, |
| 413 | std::vector<node *> &outs) { |
| 414 | std::string code; |
| 415 | |
| 416 | assert(ins.size() == 1 && outs.size() == 1); |
| 417 | |
| 418 | std::string opCode = getOpCodeStr(computeNode.symbol()); |
| 419 | |
| 420 | std::string opName = computeNode.name(); |
| 421 | |
| 422 | assert(opName.length()); |
| 423 | |
| 424 | std::string outType = getDNNC_DataTypeStr(computeNode.dtype()); |
| 425 | std::string inType = getDNNC_DataTypeStr(ins[0]->dtype()); |
| 426 | |
| 427 | // Step 1: Instantiate opterator |
| 428 | code += "\n"; |
| 429 | code += _tab + opCode + "<" + outType + ", " + inType + "> " + opName + |
| 430 | "(\"" + opName + "\");\n"; |
| 431 | |
| 432 | // Step 2: Add attribute |
| 433 | for (nodeAttribute attr : computeNode) { |
| 434 | std::string attrName = getAttrNameStr(attr.name()); |
| 435 | std::string attrVar = opName + "_" + attrName; |
| 436 | code += initializeData(attr.data(), attrVar); |
| 437 | code += _tab + opName + ".setAttribute ( attr_" + attrName + ", " + |
| 438 | attrVar + " );\n"; |
| 439 | } |
| 440 | |
| 441 | // Step 3: Add compute function. |
| 442 | std::string outTensor = nodeName(&computeNode); |
| 443 | code += _tab + "tensor<" + outType + "> " + outTensor + " = " + opName + |
| 444 | ".compute ( " + nodeName(ins[0]) + ");\n"; |
| 445 | |
| 446 | if (_graph.isOutput(computeNode.outputs()[0])) { |
| 447 | code += "\n" + _tab + "// Write the output tensor in a file.\n"; |
| 448 | code += _tab + outTensor + ".write(\"" + computeNode.outputs()[0] + |
| 449 | ".out\");\n"; |
| 450 | } |
| 451 | |
| 452 | return code; |
| 453 | } |
| 454 | |
| 455 | std::string dnnc::cppCodeGen::writeBinaryOperator(opNode &computeNode, |
| 456 | std::vector<node *> &ins, |
nothing calls this directly
no test coverage detected