M2_SETI/T1/TP/TP1/cacti_7/memcad_parameters.h

252 lines
4.4 KiB
C
Raw Normal View History

2022-11-18 15:07:43 +01:00
#ifndef __MEMCAD_PARAMS_H__
#define __MEMCAD_PARAMS_H__
#include <vector>
#include <iostream>
#include "cacti_interface.h"
#include "const.h"
#include "parameter.h"
using namespace std;
///#define INF 1000000
#define EPS 0.0000001
#define MAX_DIMM_PER_CHANNEL 3
#define MAX_CAP_PER_DIMM 64
#define MAX_RANKS_PER_DIMM 4
#define MIN_BW_PER_CHANNEL 400
#define MAX_DDR3_CHANNEL_BW 800
#define MAX_DDR4_CHANNEL_BW 1600
#define MAX_NUM_CHANNELS_PER_BOB 2
#define MAX_NUM_BOBS 6
#define DIMM_PER_CHANNEL 3
/*
enum Mem_IO_type
{
DDR3,
DDR4,
LPDDR2,
WideIO,
Low_Swing_Diff,
Serial
};
enum Mem_DIMM
{
UDIMM,
RDIMM,
LRDIMM
};
*/
class MemCadParameters
{
public:
Mem_IO_type io_type; // DDR3 vs. DDR4
int capacity; // in GB
int num_bobs; // default=4me
///int bw_per_channel; // defaul=1600 MHz;
///bool with_bob;
int num_channels_per_bob; // 1 means no bob
bool capacity_wise; // true means the load on each channel is proportional to its capacity.
///int min_bandwith;
MemCad_metrics first_metric;
MemCad_metrics second_metric;
MemCad_metrics third_metric;
DIMM_Model dimm_model;
bool low_power_permitted; // Not yet implemented. It determines acceptable VDDs.
double load; // between 0 to 1
double row_buffer_hit_rate;
double rd_2_wr_ratio;
bool same_bw_in_bob; // true if all the channels in the bob have the same bandwidth.
bool mirror_in_bob;// true if all the channels in the bob have the same configs
bool total_power; // false means just considering I/O Power
bool verbose;
// Functions
MemCadParameters(InputParameter * g_ip);
void print_inputs();
bool sanity_check();
};
//////////////////////////////////////////////////////////////////////////////////
class MemoryParameters
{
public:
// Power Parameteres
static double VDD[2][2][4];
static double IDD0[2][4];
static double IDD1[2][4];
static double IDD2P0[2][4];
static double IDD2P1[2][4];
static double IDD2N[2][4];
static double IDD3P[2][4];
static double IDD3N[2][4];
static double IDD4R[2][4];
static double IDD4W[2][4];
static double IDD5[2][4];
static double io_energy_read[2][3][3][4];
static double io_energy_write[2][3][3][4];
// Timing Parameters
static double T_RAS[2];
static double T_RC[2];
static double T_RP[2];
static double T_RFC[2];
static double T_REFI[2];
// Bandwidth Parameters
static int bandwidth_load[2][4];
// Cost Parameters
static double cost[2][3][5];
// Functions
MemoryParameters();
int bw_index(Mem_IO_type type, int bandwidth);
};
///////////////////////////////////////////////////////////////////////////
int bw_index(Mem_IO_type type, int bandwidth);
///////////////////////////////////////////////////////////////////////////
class channel_conf
{
public:
MemCadParameters *memcad_params;
Mem_DIMM type;
int num_dimm_per_channel;
int histogram_capacity[5]; // 0->4GB, 1->8GB, 2->16GB, 3->32GB, 4->64GB
bool low_power;
int capacity;
int bandwidth;
double energy_per_read;
double energy_per_write;
double energy_per_access;
double cost;
double latency;
bool valid;
// Functions
channel_conf(MemCadParameters * memcad_params, const vector<int>& dimm_cap, int bandwidth, Mem_DIMM type, bool low_power);
void calc_power();
friend channel_conf* clone(channel_conf*);
friend ostream & operator<<(ostream &os, const channel_conf& ch_cnf);
};
///////////////////////////////////////////////////////////////////////////
class bob_conf
{
public:
MemCadParameters *memcad_params;
int num_channels;
channel_conf *channels[MAX_NUM_CHANNELS_PER_BOB];
int capacity;
int bandwidth;
double energy_per_read;
double energy_per_write;
double energy_per_access;
double cost;
double latency;
bool valid;
bob_conf(MemCadParameters * memcad_params, vector<channel_conf*> * channels);
friend bob_conf* clone(bob_conf*);
friend ostream & operator <<(ostream &os, const bob_conf& bob_cnf);
};
///////////////////////////////////////////////////////////////////////////
class memory_conf
{
public:
MemCadParameters *memcad_params;
int num_bobs;
bob_conf* bobs[MAX_NUM_BOBS];
int capacity;
int bandwidth;
double energy_per_read;
double energy_per_write;
double energy_per_access;
double cost;
double latency;
bool valid;
memory_conf(MemCadParameters * memcad_params, vector<bob_conf*> * bobs);
friend ostream & operator <<(ostream &os, const memory_conf& bob_cnf);
};
#endif