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