/*
 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;
};

};

#endif /* COMPILEMODULE_H */


