/*
 Copyright 2019 Alain Dargelas

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */

/*
 * File:   hellosureworld.cpp
 * Author: alain
 *
 * Created on November 20, 2019, 08:07 PM
 */

// Example of usage:
// cd tests/UnitElabBlock
// hellosureworld top.v -parse -mutestdout
#include <iostream>
#include <functional>
#include "surelog.h"

int main(int argc, const char** argv) {
  // Read command line, compile a design, use -parse argument
  unsigned int code = 0;
  SURELOG::SymbolTable* symbolTable = new SURELOG::SymbolTable();
  SURELOG::ErrorContainer* errors = new SURELOG::ErrorContainer(symbolTable);
  SURELOG::CommandLineParser* clp =
      new SURELOG::CommandLineParser(errors, symbolTable, false, false);
  clp->noPython();
  bool success = clp->parseCommandLine(argc, argv);
  errors->printMessages(clp->muteStdout());
  SURELOG::Design* design = NULL;
  if (success && (!clp->help())) {
    SURELOG::scompiler* compiler = SURELOG::start_compiler(clp);
    design = SURELOG::get_design(compiler);
    SURELOG::shutdown_compiler(compiler);
    auto stats = errors->getErrorStats();
    code = (!success) | stats.nbFatal | stats.nbSyntax | stats.nbError;
  }
  delete clp;
  delete symbolTable;
  delete errors;

  // Browse the Data Model
  if (design) {
    for (auto& top : design->getTopLevelModuleInstances()) {
      std::function<void(SURELOG::ModuleInstance*)> inst_visit =
          [&inst_visit](SURELOG::ModuleInstance* inst) {
            std::cout << "Inst: " << inst->getFullPathName() << std::endl;
            for (unsigned int i = 0; i < inst->getNbChildren(); i++) {
              inst_visit(inst->getChildren(i));
            }
          };
      inst_visit(top);
    }
  }
  delete design;
  return code;
}
