[util] Rejig how we load hjson configurations for dvsim.py

The main new feature from this patch is that a dvsim configuration
should now set a "dvsim_flow" value. This value is used to decide
which subclass of FlowCfg to construct (in CfgFactory.py).

There are two upsides to this:

  1. You can now run a lint or synthesis run without specifying the
     tool on the command line (before, the code made a SimCfg unless
     it recognised the tool).

  2. If you run dvsim.py on some other random hjson file, you get a
     somewhat helpful error message. Before, you'd get something
     cryptic about expanding verbosity flags.

There is also a downside:

  1. Every configuration needs to specify dvsim_flow. In practice,
     this isn't so bad, because this can be done in the included
     common_*_cfg.hjson.

Note that "every configuration" here includes primary configurations.
This is kind of silly, because a "primary configuration" is really
just a list of other things to run. In later patches, we can split
these out into their own type, which should clean up quite a lot of
the code, and get rid of this requirement. However, you can't do that
splitting without the change in this patch (I tried!), so I've done
this patch first.

To make sense of how this all works:

  - dvsim.py calls CfgFactory.make_config

  - This uses CfgJson.load_hjson to load an hjson file and everything
    it includes.

  - After loading the file, make_config looks at dvsim_flow (which
    must have a value) to decide which subclass of FlowCfg to
    instantiate.

  - The constructor for FlowCfg gets passed hjson_data. It sets up
    a whole list of attributes, then calls self._merge_hjson to merge
    the data from hjson_data into itself. It then calls self._expand
    to expand all the wildcards. Subclasses can hook in to these two
    methods if they need things to happen at specific times.

The only slight complication is from primary configs: configurations
that have a list of children to be loaded and run. These need to load
up some new hjson files. They can do so by calling back to the
factory (passed in as an argument to avoid circular dependencies).

Signed-off-by: Rupert Swarbrick <rswarbrick@lowrisc.org>
diff --git a/util/dvsim/LintCfg.py b/util/dvsim/LintCfg.py
index 75cf485..7854bb4 100644
--- a/util/dvsim/LintCfg.py
+++ b/util/dvsim/LintCfg.py
@@ -18,13 +18,13 @@
 class LintCfg(OneShotCfg):
     """Derivative class for linting purposes.
     """
-    def __init__(self, flow_cfg_file, proj_root, args):
+
+    flow = 'lint'
+
+    def __init__(self, flow_cfg_file, hjson_data, args, mk_config):
         # This is a lint-specific attribute
         self.is_style_lint = ""
-        super().__init__(flow_cfg_file, proj_root, args)
-
-    def __post_init__(self):
-        super().__post_init__()
+        super().__init__(flow_cfg_file, hjson_data, args, mk_config)
 
         # Convert to boolean
         if self.is_style_lint == "True":
@@ -53,7 +53,6 @@
         results_str += "### Branch: " + self.branch + "\n"
         results_str += "\n"
 
-
         header = [
             "Name", "Tool Warnings", "Tool Errors", "Lint Warnings",
             "Lint Errors"
@@ -186,7 +185,6 @@
                              ("Lint Warnings", "lint_warnings"),
                              ("Lint Errors", "lint_errors")]
 
-
             # Lint fails if any warning or error message has occurred
             self.errors_seen = False
             for _, key in hdr_key_pairs: