/*
 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:   CompileModule.h
 * Author: alain
 *
 * Created on March 22, 2018, 9:43 PM
 */

#ifndef COMPILEMODULE_H
#define COMPILEMODULE_H

#include "CompileHelper.h"

namespace SURELOG {

struct FunctorCompileModule {
  FunctorCompileModule(CompileDesign* compiler, ModuleDefinition* module,
                       Design* design, SymbolTable* symbols,
                       ErrorContainer* errors)
      : m_compileDesign(compiler),
        m_module(module),
        m_design(design),
        m_symbols(symbols),
        m_errors(errors) {}
  int operator()() const;

 private:
  CompileDesign* m_compileDesign;
  ModuleDefinition* m_module;
  Design* m_design;
  SymbolTable* m_symbols;
  ErrorContainer* m_errors;
};

class CompileModule {
 public:
  CompileModule(CompileDesign* compiler, ModuleDefinition* module,
                Design* design, SymbolTable* symbols, ErrorContainer* errors)
      : m_compileDesign(compiler),
        m_module(module),
        m_design(design),
        m_symbols(symbols),
        m_errors(errors) {
    m_helper.seterrorReporting(errors, symbols);
  }

  bool compile();

  virtual ~CompileModule();

 private:
  bool collectModuleObjects_();
  bool checkModule_();
  bool collectInterfaceObjects_();
  bool checkInterface_();
  void compileClockingBlock_(FileContent* fC, NodeId id);
  CompileDesign* m_compileDesign;
  ModuleDefinition* m_module;
  Design* m_design;
  SymbolTable* m_symbols;
  ErrorContainer* m_errors;
  CompileHelper m_helper;
};

};  // namespace SURELOG

#endif /* COMPILEMODULE_H */
