/*
 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:   Config.cpp
 * Author: alain
 *
 * Created on February 10, 2018, 11:09 PM
 */
#include "../SourceCompile/SymbolTable.h"
#include "../Design/FileContent.h"
#include "Config.h"
using namespace SURELOG;

Config::~Config() {}

UseClause* Config::getInstanceUseClause(std::string instance) {
  std::map<std::string, UseClause>::iterator itr =
      m_instanceUseClauses.find(instance);
  if (itr == m_instanceUseClauses.end()) {
    return NULL;
  } else {
    return &(*itr).second;
  }
}

UseClause* Config::getCellUseClause(std::string cell) {
  std::map<std::string, UseClause>::iterator itr = m_cellUseClauses.find(cell);
  if (itr == m_cellUseClauses.end()) {
    return NULL;
  } else {
    return &(*itr).second;
  }
}

void Config::addInstanceUseClause(std::string instance, UseClause use) {
  auto itr = m_instanceUseClauses.find(instance);
  if (itr != m_instanceUseClauses.end()) {
    m_instanceUseClauses.erase(itr);
  }

  m_instanceUseClauses.insert(std::make_pair(instance, use));
}
void Config::addCellUseClause(std::string cell, UseClause use) {
  auto itr = m_cellUseClauses.find(cell);
  if (itr != m_cellUseClauses.end()) {
    m_instanceUseClauses.erase(itr);
  }
  m_cellUseClauses.insert(std::make_pair(cell, use));
}
