summaryrefslogtreecommitdiff
path: root/src/intersim2/power/power_module.hpp
blob: 58be23c16245bb4b1f8c2ef926d5e41a40dec445 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
// $Id: power_module.hpp 5188 2012-08-30 00:31:31Z dub $

/*
 Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University
 All rights reserved.

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:

 Redistributions of source code must retain the above copyright notice, this 
 list of conditions and the following disclaimer.
 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 OWNER 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.
*/

#ifndef _POWER_MODULE_HPP_
#define _POWER_MODULE_HPP_

#include <map>

#include "module.hpp"
#include "network.hpp"
#include "config_utils.hpp"
#include "flitchannel.hpp"
#include "switch_monitor.hpp"
#include "buffer_monitor.hpp"

struct wire{
  double L;
  double K;
  double M;
  double N;
};

class Power_Module : public Module {

protected:
  //network undersimulation
  Network * net;
  int classes;
  //all channels are this width
  double channel_width;
  //resimulate all with channel_width decremented by channel_sweep until 0
  double  channel_sweep; 
  //write result to a tabbed format to file
  string output_file_name;

  //buffer depth
  double depthVC;
  //vcs
  double numVC;

  //store the property of wires based on length
  map<double, wire> wire_map;

  //////////////////////////////////Constants/////////////////////////////
  //wire length in (mm)
  double wire_length;
  //////////Metal Parameters////////////
  // Wire left/right coupling capacitance [ F/mm ]
  double Cw_cpl ; 
  // Wire up/down groudn capacitance      [ F/mm ]
  double Cw_gnd  ;
  double Cw ;
  double Rw ;
  // metal pitch [mm]
  double MetalPitch ; 


  //////////Device Parameters////////////
  
  double LAMBDA  ;       // [um/LAMBDA]
  double Cd   ;           // [F/um] (for Delay)
  double Cg  ;           // [F/um] (for Delay)
  double Cgdl  ;           // [F/um] (for Delay)
  
  double Cd_pwr;           // [F/um] (for Power)
  double Cg_pwr  ;           // [F/um] (for Power)
			       
  double IoffN  ;            // [A/um]
  double IoffP  ;            // [A/um]
  // Leakage from bitlines, two-port cell  [A]
  double IoffSRAM;  
  // [Ohm] ( D1=1um Inverter)
  double R     ;                         
  // [F]   ( D1=1um Inverter - for Power )
  double Ci_delay;   
  // [F]   ( D1=1um Inverter - for Power )
  double Co_delay ;              

  double Ci ;
  double Co ;
  double Vdd  ;
  double FO4   ;		     
  double tCLK ;
  double fCLK ;              

  double H_INVD2;
  double W_INVD2;
  double H_DFQD1;
  double W_DFQD1;
  double H_ND2D1;
  double W_ND2D1;
  double H_SRAM;
  double W_SRAM;
  double  ChannelPitch ;
  double   CrossbarPitch;
  ////////////////////////////////End of Constants/////////////////////////////

  /////////////results///////////////////
  double totalTime;
  double channelWirePower;
  double channelClkPower;
  double channelDFFPower;
  double channelLeakPower;
  double inputReadPower;
  double inputWritePower;
  double inputLeakagePower;
  double switchPower;
  double switchPowerCtrl;
  double switchPowerLeak;
  double outputPower;
  double outputPowerClk;
  double outputCtrlPower;
  double channelArea;
  double switchArea;
  double inputArea;
  double outputArea;
  double maxInputPort;
  double maxOutputPort;


  ////////////////////////

  //channels
  void calcChannel(const FlitChannel * f);
  wire const & wireOptimize(double l);
  double powerRepeatedWire(double L, double K, double M, double N);
  double powerRepeatedWireLeak (double K, double M, double N);
  double powerWireClk (double M, double W);
  double powerWireDFF(double M, double W, double alpha);
  
  //memory
  void calcBuffer(const BufferMonitor *bm);
  double powerWordLine(double memoryWidth, double memoryDepth);
  double powerMemoryBitRead(double memoryDepth);
  double powerMemoryBitWrite(double memoryDepth);
  double powerMemoryBitLeak(double memoryDepth );

  //switch
  void calcSwitch(const SwitchMonitor *sm);
  double powerCrossbar(double width, double inputs, double outputs, double from, double to);
  double powerCrossbarCtrl(double width, double inputs, double outputs);
  double powerCrossbarLeak (double width, double inputs, double outputs);
  
  //output
  double powerOutputCtrl(double width);

  //area

  double areaChannel (double K, double N, double M);
  double areaCrossbar(double Inputs, double Outputs) ;
  double areaInputModule(double Words) ;
  double areaOutputModule(double Outputs);

public:
  Power_Module(Network * net, const Configuration &config);
  ~Power_Module();

  void run();


};
#endif