00001
00013 #ifndef DEVICE_H
00014 #define DEVICE_H
00015
00016 #include <string>
00017 #include <iostream>
00018 #include <map>
00019 #include <vector>
00020
00021 #include "coordinates.h"
00022 #include "cell.h"
00023
00024 using namespace std;
00025
00027 enum DeviceClass{UNDEF, Virtex5, Virtex6, Virtex7, Kintex7, Zynq7, CUSTOM};
00028
00029 const int NB_LUT_SLICE = 4;
00030 const int NB_FF_SLICE = 8;
00031 const int NB_LUT_CLB = 8;
00032 const int NB_FF_CLB = 16;
00033 const int NB_DRAM_CLB = 256;
00034 const int NB_SHIFT_REG_CLB = 128;
00035 const int NB_CLB_PER_COLUMN = 40;
00036 const int NB_RAMB36_BRAM = 8;
00037 const int NB_DSP48_DSP = 16;
00038 const int NB_IOB_PER_COLUMN = 40;
00039
00040 const int NB_FRAMES_PER_CLB_COLUMN = 36;
00041 const int NB_FRAMES_PER_DSP_COLUMN = 30;
00042 const int NB_FRAMES_PER_BRAM_COLUMN = 158;
00043 const int NB_FRAMES_PER_IOB_COLUMN = 30;
00044 const int NB_WORDS_PER_FRAME = 82;
00045
00046
00047 const Cell SliceM_cell("SliceM", true, 40, 4, NB_FRAMES_PER_CLB_COLUMN * NB_CLB_PER_COLUMN / 2 * 4, true);
00048 const Cell SliceL_cell("SliceL", true, 40, 1, NB_FRAMES_PER_CLB_COLUMN * NB_CLB_PER_COLUMN / 2 * 4, true);
00049 const Cell Slice_cell("Slice", true, 40, 1, NB_FRAMES_PER_CLB_COLUMN * NB_CLB_PER_COLUMN / 2 * 4, true);
00050 const Cell CLBm_cell("CLBm", true, 40, 4, NB_FRAMES_PER_CLB_COLUMN * NB_CLB_PER_COLUMN * 4, true);
00051 const Cell CLBl_cell("CLBl", true, 40, 1, NB_FRAMES_PER_CLB_COLUMN * NB_CLB_PER_COLUMN * 4, true);
00052 const Cell BRAM_cell("BRAM", true, 8, 24, NB_FRAMES_PER_BRAM_COLUMN * NB_RAMB36_BRAM * 4, false);
00053 const Cell DSP_cell("DSP", true, 16, 24, NB_FRAMES_PER_DSP_COLUMN * NB_DSP48_DSP * 4, false);
00054 const Cell IOB_cell("IOB", false, 40, 100, NB_FRAMES_PER_IOB_COLUMN * NB_IOB_PER_COLUMN * 4, false);
00055 const Cell MMCM_cell("MMCM", false);
00056 const Cell PCI_cell("PCI", false);
00057 const Cell EMAC_cell("EMAC", false);
00058 const Cell XXX_cell("XXX", false);
00059 const Cell CLB_XXX_cell("CLB_XXX", false);
00060 const Cell DSP_XXX_cell("DSP_XXX", false);
00061 const Cell BRAM_XXX_cell("BRAM_XXX", false);
00062 const Cell DCM_cell("DCM", false);
00063
00064 enum RBType{SliceM, SliceL, Slice, CLBm, CLBl, BRAM, DSP, IOB, MMCM, PCI, EMAC, XXX, CLB_XXX, DSP_XXX, BRAM_XXX, DCM};
00065
00066 const int NB_LINES_DEVICE = 6;
00067 const int NB_COLUMNS_DEVICE = 102;
00068
00069 const RBType fpga_device[NB_LINES_DEVICE][NB_COLUMNS_DEVICE] = {
00070 {IOB,CLBm,CLBl,CLBm,CLBl,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBl,CLBm,CLBl,IOB,CLBm,CLBl,CLBm,CLBl,CLBl,CLBl,CLBl,CLBl,CLBl,CLBl,MMCM,CLBm,CLBl,CLBm,CLBl,IOB,CLBm,CLBl,CLBm,CLBl,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBl,CLBm,CLBl,CLBl,CLBm,CLBl,BRAM},
00071 {IOB,CLBm,CLBl,CLBm,CLBl,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBl,CLBm,CLBl,IOB,CLBm,CLBl,CLBm,CLBl,CLBl,CLBl,CLBl,CLBl,CLBl,CLBl,MMCM,CLBm,CLBl,CLBm,CLBl,IOB,CLBm,CLBl,CLBm,CLBl,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBl,CLBm,CLBl,PCI,PCI,PCI,PCI},
00072 {IOB,CLBm,CLBl,CLBm,CLBl,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBl,CLBm,CLBl,IOB,CLBm,CLBl,CLBm,CLBl,CLB_XXX,CLB_XXX,CLB_XXX,CLB_XXX,CLB_XXX,CLB_XXX,MMCM,CLBm,CLBl,CLBm,CLBl,IOB,CLBm,CLBl,CLBm,CLBl,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBl,CLBm,CLBl,CLBl,CLBm,CLBl,EMAC},
00073 {IOB,CLBm,CLBl,CLBm,CLBl,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBl,CLBm,CLBl,IOB,CLBm,CLBl,CLBm,CLBl,CLB_XXX,CLB_XXX,CLB_XXX,CLB_XXX,CLB_XXX,CLB_XXX,MMCM,CLBm,CLBl,CLBm,CLBl,IOB,CLBm,CLBl,CLBm,CLBl,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBl,CLBm,CLBl,PCI,PCI,PCI,PCI},
00074 {IOB,CLBm,CLBl,CLBm,CLBl,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBl,CLBm,CLBl,IOB,CLBm,CLBl,CLBm,CLBl,CLBl,CLBl,CLBl,CLBl,CLBl,CLBl,MMCM,CLBm,CLBl,CLBm,CLBl,IOB,CLBm,CLBl,CLBm,CLBl,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBl,CLBm,CLBl,CLBl,CLBm,CLBl,EMAC},
00075 {IOB,CLBm,CLBl,CLBm,CLBl,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBl,CLBm,CLBl,IOB,CLBm,CLBl,CLBm,CLBl,CLBl,CLBl,CLBl,CLBl,CLBl,CLBl,MMCM,CLBm,CLBl,CLBm,CLBl,IOB,CLBm,CLBl,CLBm,CLBl,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,CLBm,BRAM,CLBm,CLBm,DSP,CLBm,CLBm,CLBm,CLBm,DSP,CLBm,CLBm,BRAM,CLBm,CLBl,CLBm,CLBl,CLBl,CLBm,CLBl,BRAM}
00076 };
00077
00078 const int x_coordinate_fpga_device[NB_LINES_DEVICE][NB_COLUMNS_DEVICE] = {
00079 {0,0,2,4,6,0,8,10,0,12,14,16,18,1,20,22,1,24,26,28,30,32,34,36,38,2,40,42,2,44,46,48,50,3,52,54,3,56,58,60,62,1,64,66,68,70,72,74,76,78,80,82,0,84,86,88,90,2,92,94,96,98,4,100,102,4,104,106,108,110,5,112,114,5,116,118,120,122,124,126,128,130,6,132,134,6,136,138,140,142,7,144,146,7,148,150,152,154,156,158,160,8},
00080 {0,0,2,4,6,0,8,10,0,12,14,16,18,1,20,22,1,24,26,28,30,32,34,36,38,2,40,42,2,44,46,48,50,3,52,54,3,56,58,60,62,1,64,66,68,70,72,74,76,78,80,82,0,84,86,88,90,2,92,94,96,98,4,100,102,4,104,106,108,110,5,112,114,5,116,118,120,122,124,126,128,130,6,132,134,6,136,138,140,142,7,144,146,7,148,150,152,154,0,1,2,3},
00081 {0,0,2,4,6,0,8,10,0,12,14,16,18,1,20,22,1,24,26,28,30,32,34,36,38,2,40,42,2,44,46,48,50,3,52,54,3,56,58,60,62,1,64,66,68,70,36,74,76,78,80,82,0,84,86,88,90,2,92,94,96,98,4,100,102,4,104,106,108,110,5,112,114,5,116,118,120,122,124,126,128,130,6,132,134,6,136,138,140,142,7,144,146,7,148,150,152,154,156,158,160,0},
00082 {0,0,2,4,6,0,8,10,0,12,14,16,18,1,20,22,1,24,26,28,30,32,34,36,38,2,40,42,2,44,46,48,50,3,52,54,3,56,58,60,62,1,64,66,68,70,36,74,76,78,80,82,0,84,86,88,90,2,92,94,96,98,4,100,102,4,104,106,108,110,5,112,114,5,116,118,120,122,124,126,128,130,6,132,134,6,136,138,140,142,7,144,146,7,148,150,152,154,0,1,2,3},
00083 {0,0,2,4,6,0,8,10,0,12,14,16,18,1,20,22,1,24,26,28,30,32,34,36,38,2,40,42,2,44,46,48,50,3,52,54,3,56,58,60,62,1,64,66,68,70,72,74,76,78,80,82,0,84,86,88,90,2,92,94,96,98,4,100,102,4,104,106,108,110,5,112,114,5,116,118,120,122,124,126,128,130,6,132,134,6,136,138,140,142,7,144,146,7,148,150,152,154,156,158,160,0},
00084 {0,0,2,4,6,0,8,10,0,12,14,16,18,1,20,22,1,24,26,28,30,32,34,36,38,2,40,42,2,44,46,48,50,3,52,54,3,56,58,60,62,1,64,66,68,70,72,74,76,78,80,82,0,84,86,88,90,2,92,94,96,98,4,100,102,4,104,106,108,110,5,112,114,5,116,118,120,122,124,126,128,130,6,132,134,6,136,138,140,142,7,144,146,7,148,150,152,154,156,158,160,8}
00085 };
00086
00087
00088 class Device {
00089
00090 private:
00091
00092 string deviceID;
00093 string package;
00094 string speedGrade;
00095 DeviceClass deviceClass;
00096
00097
00098 RBType **RBTable;
00099 int nb_lines;
00100 int nb_columns;
00101
00102
00103 map<RBType, Cell> deviceCellMap;
00104
00105
00106 vector<Coordinates> restrictedColumns;
00107
00108
00109 int nb_LUT_Slice;
00110 int nb_FF_Slice;
00111 int nb_LUT_CLB;
00112 int nb_FF_CLB;
00113
00114
00115 public:
00121 Device() {
00122
00123 deviceID = "xc6vlx240t";
00124 package = "ff1156";
00125 speedGrade = "-1";
00126 deviceClass = Virtex6;
00127
00128 nb_lines = NB_LINES_DEVICE;
00129 nb_columns = NB_COLUMNS_DEVICE;
00130 RBTable = new RBType*[nb_lines];
00131 for(int i = 0; i < nb_lines; i++) RBTable[i] = (RBType *) fpga_device[i];
00132
00133
00134 deviceCellMap[SliceM] = SliceM_cell;
00135 deviceCellMap[SliceL] = SliceL_cell;
00136 deviceCellMap[Slice] = Slice_cell;
00137 deviceCellMap[CLBm] = CLBm_cell;
00138 deviceCellMap[CLBl] = CLBl_cell;
00139 deviceCellMap[BRAM] = BRAM_cell;
00140 deviceCellMap[DSP] = DSP_cell;
00141 deviceCellMap[IOB] = IOB_cell;
00142 deviceCellMap[MMCM] = MMCM_cell;
00143 deviceCellMap[PCI] = PCI_cell;
00144 deviceCellMap[EMAC] = EMAC_cell;
00145 deviceCellMap[XXX] = XXX_cell;
00146 deviceCellMap[CLB_XXX] = CLB_XXX_cell;
00147 deviceCellMap[DSP_XXX] = DSP_XXX_cell;
00148 deviceCellMap[BRAM_XXX] = BRAM_XXX_cell;
00149 deviceCellMap[DCM] = DCM_cell;
00150
00151
00152 nb_LUT_Slice = NB_LUT_SLICE;
00153 nb_FF_Slice = NB_FF_SLICE;
00154 nb_LUT_CLB = NB_LUT_CLB;
00155 nb_FF_CLB = NB_FF_CLB;
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 for(int i = 0; i < NB_LINES_DEVICE / 2; i++) {
00175 for(int j = 0; j < NB_COLUMNS_DEVICE; j++) restrictedColumns.push_back(Coordinates(j, i));
00176 }
00177
00178
00179 for(int i = 0; i < NB_LINES_DEVICE; i++) {
00180 for(int j = 0; j < NB_COLUMNS_DEVICE / 2; j++) restrictedColumns.push_back(Coordinates(j, i));
00181 }
00182 };
00183
00184 ~Device() {
00185 delete[] RBTable;
00186 }
00187
00188
00189 int getNbLines(void);
00190 int getNbColumns(void);
00191 string getDeviceID(void);
00192 string getDevicePackage(void);
00193 string getDeviceSpeedGrade(void);
00194 DeviceClass getDeviceClass(void);
00195
00196
00197 int getResourceCost(RBType rbtype);
00198 int getResourceCount(RBType rbt);
00199
00200
00201 RBType getRB(int line, int column) const;
00202 RBType getColumnRBType(int column);
00203 bool isRBReconfigurable(RBType rbt);
00204 Cell getCell(RBType);
00205 string getCellName(RBType);
00206 RBType getRBType(string) const;
00207
00208
00209 bool isColumnUsable(int line, int column);
00210
00211
00212 int getPhysicalXCoordinate(int line, int column);
00213
00214
00215 void printDevice(void);
00216
00217
00218
00219 int getNbLUTInSlice(void);
00220 int getNbFFInSlice(void);
00221 int getNbLUTInCLB(void);
00222 int getNbFFInCLB(void);
00223
00224 };
00225
00226 #endif