/*
 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:   Library.cpp
 * Author: alain
 * 
 * Created on January 27, 2018, 5:25 PM
 */
#include "../SourceCompile/SymbolTable.h"
#include "../Design/FileContent.h"
#include "../Design/ModuleDefinition.h"
#include "Library.h"

using namespace SURELOG;

Library::~Library () { }

void Library::addModuleDefinition(ModuleDefinition* def) {
  m_modules.insert(std::make_pair(def->getName (), def));
}

ModuleDefinition* Library::getModule(std::string name) {
  std::map<std::string, ModuleDefinition*>::iterator itr = m_modules.find(name);
  if (itr == m_modules.end())
    {
      return NULL;
    }
  else 
    {
      return (*itr).second;
    }
}

std::string Library::report(SymbolTable* symbols) {
  std::string report;
  report = "LIB: " + m_name + "\n";
  for (auto id : m_fileIds)
    {
      report += "     " + symbols->getSymbol (id) + "\n";
    } 
  return report;
}
