Imported Upstream version 1.25.0
[platform/core/ml/nnfw.git] / compiler / one-cmds / onecc
index 4cc7740..c7a76c5 100644 (file)
@@ -24,6 +24,7 @@ import configparser
 import os
 import subprocess
 import sys
+from types import SimpleNamespace
 
 from onelib.CfgRunner import CfgRunner
 from onelib.WorkflowRunner import WorkflowRunner
@@ -67,7 +68,7 @@ def _check_subtool_exists():
 
 
 def _get_parser():
-    onecc_usage = 'onecc [-h] [-v] [-C CONFIG] [-W WORKFLOW] [-O OPTIMIZATION] [COMMAND <args>]'
+    onecc_usage = 'onecc [-h] [-v] [-C CONFIG] [-b BACKEND] [-W WORKFLOW] [-O OPTIMIZATION] [COMMAND <args>]'
     onecc_desc = 'Run ONE driver via several commands or configuration file'
     parser = argparse.ArgumentParser(description=onecc_desc, usage=onecc_usage)
 
@@ -86,6 +87,9 @@ def _get_parser():
     parser.add_argument(
         '-W', '--workflow', type=str, metavar='WORKFLOW', help='run with workflow file')
 
+    parser.add_argument(
+        '-b', '--backend', type=str, help='generate code for given backend')
+
     # just for help message
     compile_group = parser.add_argument_group('compile to circle model')
     for tool, desc in subtool_list['compile'].items():
@@ -111,6 +115,48 @@ def _parse_arg(parser):
     return args
 
 
+def _verify_backend_args(parser, args):
+    """
+    verify one-profile, one-codegen arguments
+
+    This verification logic comes from each drivers' codes.
+    """
+    cfgparser = configparser.ConfigParser()
+    cfgparser.optionxform = str
+    cfgparser.read(args.config)
+
+    for driver in ['one-profile', 'one-codegen']:
+        if not driver in cfgparser:
+            continue
+
+        cfg_args = SimpleNamespace()
+        oneutils.parse_cfg(args.config, driver, cfg_args)
+        cmd_backend_exist = oneutils.is_valid_attr(args, 'backend')
+        cfg_backend_exist = oneutils.is_valid_attr(cfg_args, 'backend')
+        cfg_backends_exist = oneutils.is_valid_attr(cfg_args, 'backends')
+
+        if cfg_backend_exist and cfg_backends_exist:
+            parser.error(
+                "'backend' option and 'backends' option cannot be used simultaneously.")
+
+        # Check if given backend from command line exists in the configuration file
+        if cmd_backend_exist and cfg_backend_exist:
+            if args.backend != cfg_args.backend:
+                parser.error('Not found the command of given backend')
+
+        if cfg_backends_exist:
+            cfg_backends = getattr(cfg_args, 'backends').split(',')
+            # check if commands of given backends exist
+            for b in cfg_backends:
+                if not oneutils.is_valid_attr(cfg_args, b):
+                    parser.error('Not found the command for ' + b)
+
+            # Check if given backend from command line exists in the configuration file
+            if cmd_backend_exist:
+                if args.backend not in cfg_backends:
+                    parser.error('Not found the command of given backend')
+
+
 def _verify_arg(parser, args):
     """verify given arguments"""
     # check if required arguments is given
@@ -126,6 +172,13 @@ def _verify_arg(parser, args):
         if not getattr(args, 'O') in opt_name_list:
             parser.error('Invalid optimization option')
 
+    if oneutils.is_valid_attr(args, 'backend') and oneutils.is_valid_attr(
+            args, 'workflow'):
+        parser.error('\'backend\' option can be used only with \'config\' option')
+
+    if oneutils.is_valid_attr(args, 'backend'):
+        _verify_backend_args(parser, args)
+
 
 def main():
     # check if there is subtool argument
@@ -152,6 +205,8 @@ def main():
         runner.detect_import_drivers(bin_dir)
         if oneutils.is_valid_attr(args, 'O'):
             runner.add_opt(getattr(args, 'O'))
+        if oneutils.is_valid_attr(args, 'backend'):
+            runner.set_backend(args.backend)
         runner.run(bin_dir)
     elif oneutils.is_valid_attr(args, 'workflow'):
         runner = WorkflowRunner(args.workflow)