/*
 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:   CompileDesign.h
 * Author: alain
 *
 * Created on July 1, 2017, 1:11 PM
 */

#ifndef COMPILEDESIGN_H
#define COMPILEDESIGN_H

namespace SURELOG {
  

class CompileDesign {
public:
    CompileDesign(Compiler* compiler);
    
    bool compile();
    bool elaborate();
    
    CompileDesign(const CompileDesign& orig);
    virtual ~CompileDesign();
    Compiler* getCompiler() { return m_compiler; }
private:
    
   template <class ObjectType, class ObjectMapType, typename FunctorType> 
            void compileMT_ (ObjectMapType& objects, int maxThreadCount);
    
    void collectObjects_ (Design::FileIdDesignContentMap& all_files, Design* design, bool finalCollection);
    bool preCompile_();
    bool checkPrecompilation_();    
    bool elaboration_();
    
    
    Compiler* m_compiler;
    std::vector<SymbolTable*>       m_symbolTables;
    std::vector<ErrorContainer*>    m_errorContainers;
};

};

#endif /* COMPILEDESIGN_H */


