blob: 515220d7c1508045b6c04fb110a9c88edaff8853 [file] [log] [blame] [edit]
/*
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: DesignElaboration.h
* Author: alain
*
* Created on July 12, 2017, 8:55 PM
*/
#ifndef DESIGNELABORATION_H
#define DESIGNELABORATION_H
#include "DesignCompile/ElaborationStep.h"
#include "Expression/ExprBuilder.h"
namespace SURELOG {
class DesignElaboration : public ElaborationStep {
public:
DesignElaboration(CompileDesign* compileDesign);
DesignElaboration(const DesignElaboration& orig) = delete;
virtual ~DesignElaboration();
bool createModuleAndPackageDefinitions();
bool elaborate();
private:
bool createBuiltinPrimitives_();
bool setupConfigurations_();
bool identifyTopModules_();
bool elaborateAllModules_(bool onlyTopLevel);
void reportElaboration_();
bool elaborateModule_(std::string moduleName, FileContent* fileContent,
bool onlyTopLevel);
void checkElaboration_();
void collectParams_(std::vector<std::string>& params, FileContent* fC,
NodeId nodeId, ModuleInstance* instance,
NodeId parentParamOverride);
void elaborateInstance_(FileContent* fC, NodeId nodeId,
NodeId parentParamOverride,
ModuleInstanceFactory* factory,
ModuleInstance* parent, Config* config);
void recurseInstanceLoop_(std::vector<int>& from, std::vector<int>& to,
std::vector<int>& indexes, unsigned int pos,
DesignComponent* def, FileContent* fC,
NodeId subInstanceId, NodeId paramOverride,
ModuleInstanceFactory* factory,
ModuleInstance* parent, Config* config,
std::string instanceName, std::string modName,
std::vector<ModuleInstance*>& allSubInstances);
void recurseBuildInstanceClause_(std::string parentPath, Config* config,
std::set<Config*>& stack);
void reduceUnnamedBlocks_();
void checkConfigurations_();
Config* getInstConfig(std::string name);
Config* getCellConfig(std::string name);
std::vector<std::pair<std::string, FileContent*>> m_topLevelModules;
std::set<std::string> m_uniqueTopLevelModules;
ExprBuilder m_exprBuilder;
ModuleDefinitionFactory* m_moduleDefFactory;
ModuleInstanceFactory* m_moduleInstFactory;
std::set<std::string> m_toplevelConfigModules;
std::map<std::string, Config> m_instConfig;
std::map<std::string, Config> m_cellConfig;
std::map<std::string, UseClause> m_instUseClause;
std::map<std::string, UseClause> m_cellUseClause;
};
}; // namespace SURELOG
#endif /* DESIGNELABORATION_H */