text: /*******************************************************************************
  * Copyright (c) 2017-2020
  * School of Electrical, Computer and Energy Engineering, Arizona State University
  * PI: Prof. Yu Cao
  * All rights reserved.
  *
  * This source code is part of NeuroSim - a device-circuit-algorithm framework to benchmark
  * neuro-inspired architectures with synaptic devices(e.g., SRAM and emerging non-volatile memory).
  * Copyright of the model is maintained by the developers, and the model is distributed under
  * the terms of the Creative Commons Attribution-NonCommercial 4.0 International Public License
  * http://creativecommons.org/licenses/by-nc/4.0/legalcode.
  * The source code is free and you can redistribute and/or modify it
  * by providing that the following conditions are met:
  *
  *  1) Redistributions of source code must retain the above copyright notice,
  *     this list of conditions and the following disclaimer.
  *
  *  2) Redistributions in binary form must reproduce the above copyright notice,
  *     this list of conditions and the following disclaimer in the documentation
  *     and/or other materials provided with the distribution.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * Developer list:
  *		Gokul Krishnan Email: gkrish19@asu.edu
  
  * Credits: Prof.Shimeng Yu and his research group for NeuroSim
  ********************************************************************************/
  
  #include <cmath>
  #include <iostream>
  #include "constant.h"
  #include "formula.h"
  #include "SramNewSA.h"
  
  using namespace std;
  
  SramNewSA::SramNewSA(const InputParameter& _inputParameter, const Technology& _tech, const MemCell& _cell): inputParameter(_inputParameter), tech(_tech), cell(_cell), FunctionUnit() {
  	initialized = false;
  }
  
  void SramNewSA::Initialize(int _numCol, int _levelOutput) {
  	if (initialized)
  		cout << "[SramNewSA] Warning: Already initialized!" << endl;
  
  	numCol = _numCol;
  	levelOutput = _levelOutput;
  
  	initialized = true;
  }
  
  void SramNewSA::CalculateArea(double _newHeight, double _newWidth, AreaModify _option) {
  	if (!initialized) {
  		cout << "[SramNewSA] Error: Require initialization first!" << endl;
  	} else {
  		height = width = area = 0;
  
  		double heightUnit = 1.072e-5;
  		double widthUnit = 1.011e-5;
  		double areaUnit;
  
  		areaUnit = (levelOutput-1) * heightUnit * widthUnit;
  
  		width = _newWidth;
  		area = areaUnit * numCol;
  		height = area/width;
  
  
  		// Modify layout
  		newHeight = _newHeight;
  		newWidth = _newWidth;
  		switch (_option) {
  			case MAGIC:
  				MagicLayout();
  				break;
  			case OVERRIDE:
  				OverrideLayout();
  				break;
  			default:	// NONE
  				break;
  		}
  
  	}
  }
  
  void SramNewSA::CalculateLatency(double numRead) {
  	if (!initialized) {
  		cout << "[SramNewSA] Error: Require initialization first!" << endl;
  	} else {
  		readLatency = 0;
  
  		readLatency = 0.1e-9;
  
  		readLatency *= numRead;
  	}
  }
  
  void SramNewSA::CalculatePower(double numRead) {
  	if (!initialized) {
  		cout << "[SramNewSA] Error: Require initialization first!" << endl;
  	} else {
  		leakage = 0;
  		readDynamicEnergy = 0;
  
  		readDynamicEnergy = 0.092e-12;
  		readDynamicEnergy *= (levelOutput-1);
  
  		readDynamicEnergy *= numCol;
  		readDynamicEnergy *= numRead;
  	}
  }
  
  void SramNewSA::PrintProperty(const char* str) {
  	FunctionUnit::PrintProperty(str);
  }
  