OEIL
definition_electrical.h
1 /*********************************************************************************
2  *
3  * File name: defination_electrical.h
4  * Version: 3.0
5  * Software:
6  * Authors: Zhehui Wang, Jiang Xu
7  * Website: http://www.ece.ust.hk/~eexu/
8  * The copyright information of this program can be found in the file COPYRIGHT.
9  *
10  *********************************************************************************/
11 
12 #ifndef DEFINITION_ELECTRICAL_H
13 #define DEFINITION_ELECTRICAL_H
14 
15 #include <math.h>
16 #include <stdio.h>
17 #include <stdlib.h>
18 
19 #include <fstream>
20 
21 /*file pointer to the files*/
22 FILE* parameter_flie_electrical;
23 FILE* configuration_file_electrical;
24 FILE* output_file_electrical;
25 
26 /*The following is for PCB*/
27 double pcb_layer_height; // The height of a single PCB layer unit:mil
28 double pcb_trace_width; // The width of a PCB traces unit:mil
29 double pcb_trace_height; // The height of a PCB traces unit:mil
30 double pcb_trace_pair_pitch; // The pitch of PCB trace pairs unit:mil
31 double pcb_loss_tangent; // The loss tangent of dielectric material of PCB board unit:N/A
32 double pcb_dielectric; // The relative dielectric constant value of PCB board unit:N/A
33 double package_pin_pitch; // The pitch of electrical pins on the package :mm
34 
35 /*The following is for trace*/
36 double trace_half_depth_f; // The frequency when the skin depth is equal to half of trace height unit:MHz
37 double trace_characteristic_z; // The xxx unit:mOhm
38 double trace_unit_length_c; // The xxx unit:pF/cm
39 double trace_direct_current_r; // The xxx unit:mOhm
40 double trace_input_impendance; // The xxx unit:mOhm
41 double electrical_pin_load_c; // The xxx unit:pF
42 
43 /*The following is for transceiver*/
44 double la_threshold_voltage; // The threshold voltage of the limiting amplifier unit:mV
45 double la_offset_coefficent; // The offset coefficent of the limiting amplifier unit:N/A
46 double la_coefficent_margin; // The coefficent margin of the limiting amplifier unit:N/A
47 double circuit_voltage; // The supply voltage of the circuit unit:V
48 
49 /*The following is for serdes*/
50 double serdes_cur_electrical; // The unit current in SerDes circuit unit in electrical interconnect unit:mA/Gbps
51 double serdes_area_electrical; // The unit area in SerDes circuit unit in electrical interconnect unit:um^2/Gbps
52 
53 /*The following is for configurations*/
54 double
55  data_rate_electrical; // The data rate of signals in electrical interconnects, which is double the working frequency unit:N/A
56 double length_electrical; // the length of the electrical interconnect unit:cm
57 int serdes_ratio_electrical; // the parallel-to-serial ratio of SerDes in electrical interconnect unit:N/A
58 int number_of_parallel_traces; // number of PCB trace pairs in electrical interconnects unit:N/A
59 
60 /*The following is for calculated results*/
61 double sensitivity_la; // the sensitivity of electrical receiver unit:mV
62 double crosstalk_coefficient_electrical; // the ratio of noise voltage to signal voltage unit:N/A
63 double total_attenuation_electrical; // the total attenuation on the entire electrical interconenct unit: N/A
64 double energy_consumption_electrical; // the energy consumed by interconect per bit unit:pJ/bit
65 double area_density_electrical; // the area bandwidth density of electrical interconnect unit:Gbps/mm^2
66 double linear_density_electrical; // the linear bandwidth density of electrical interconnect unit:Gbps/mm
67 double area_electrical; // the area of electrical interconnect unit:mm^2
68 double latency_value_electrical; // the signal latency of electrical interconnect unit:ns
69 
70 /*this is to read the paramters from the file parameter_electrical.txt*/
71 void read_parameter_electrical() {
72  printf("Electrical:\n");
73  char* name = new char[50];
74  char* unit = new char[20];
75  parameter_flie_electrical = fopen("../config/parameter_electrical.txt", "r");
76  if (parameter_flie_electrical == NULL) {
77  printf("Cannot open file parameter_electrical.txt\n");
78  exit(-1);
79  }
80  /*skip the text file head.*/
81  for (int i = 0; i < 10; i++) {
82  char* line = NULL;
83  size_t len = 0;
84  getline(&line, &len, parameter_flie_electrical);
85  }
86  // for (int i = 0; i < 37; i++) {
87  // fscanf(parameter_flie_electrical, "%s\n", name);
88  // }
89  /*parameters for PCB*/
90  fscanf(parameter_flie_electrical, "%s\n", name);
91  printf("%s\n", name);
92  fscanf(parameter_flie_electrical, "%lf %s %s\n", &pcb_layer_height, name, unit);
93  printf("%s\t%f\t%s\n", name, pcb_layer_height, unit);
94  fscanf(parameter_flie_electrical, "%lf %s %s\n", &pcb_trace_width, name, unit);
95  printf("%s\t\t%f\t%s\n", name, pcb_trace_width, unit);
96  fscanf(parameter_flie_electrical, "%lf %s %s\n", &pcb_trace_height, name, unit);
97  printf("%s\t%f\t%s\n", name, pcb_trace_height, unit);
98  fscanf(parameter_flie_electrical, "%lf %s %s\n", &pcb_trace_pair_pitch, name, unit);
99  printf("%s\t%f\t%s\n", name, pcb_trace_pair_pitch, unit);
100  fscanf(parameter_flie_electrical, "%lf %s %s\n", &pcb_loss_tangent, name, unit);
101  printf("%s\t%f\t%s\n", name, pcb_loss_tangent, unit);
102  fscanf(parameter_flie_electrical, "%lf %s %s\n", &pcb_dielectric, name, unit);
103  printf("%s\t\t%f\t%s\n", name, pcb_dielectric, unit);
104  fscanf(parameter_flie_electrical, "%lf %s %s\n", &package_pin_pitch, name, unit);
105  printf("%s\t%f\t%s\n", name, package_pin_pitch, unit);
106 
107  /*parameters for trace*/
108  fscanf(parameter_flie_electrical, "%s\n", name);
109  printf("%s\n", name);
110  fscanf(parameter_flie_electrical, "%lf %s %s\n", &trace_half_depth_f, name, unit);
111  printf("%s\t%f\t%s\n", name, trace_half_depth_f, unit);
112  fscanf(parameter_flie_electrical, "%lf %s %s\n", &trace_characteristic_z, name, unit);
113  printf("%s\t%f\t%s\n", name, trace_characteristic_z, unit);
114  fscanf(parameter_flie_electrical, "%lf %s %s\n", &trace_unit_length_c, name, unit);
115  printf("%s\t%f\t%s\n", name, trace_unit_length_c, unit);
116  fscanf(parameter_flie_electrical, "%lf %s %s\n", &trace_direct_current_r, name, unit);
117  printf("%s\t%f\t%s\n", name, trace_direct_current_r, unit);
118  fscanf(parameter_flie_electrical, "%lf %s %s\n", &trace_input_impendance, name, unit);
119  printf("%s\t%f\t%s\n", name, trace_input_impendance, unit);
120  fscanf(parameter_flie_electrical, "%lf %s %s\n", &electrical_pin_load_c, name, unit);
121  printf("%s\t%f\t%s\n", name, electrical_pin_load_c, unit);
122 
123  /*parameters for transceiver*/
124  fscanf(parameter_flie_electrical, "%s\n", name);
125  printf("%s\n", name);
126  fscanf(parameter_flie_electrical, "%lf %s %s\n", &la_threshold_voltage, name, unit);
127  printf("%s\t%f\t%s\n", name, la_threshold_voltage, unit);
128  fscanf(parameter_flie_electrical, "%lf %s %s\n", &la_offset_coefficent, name, unit);
129  printf("%s\t%f\t%s\n", name, la_offset_coefficent, unit);
130  fscanf(parameter_flie_electrical, "%lf %s %s\n", &la_coefficent_margin, name, unit);
131  printf("%s\t%f\t%s\n", name, la_coefficent_margin, unit);
132  fscanf(parameter_flie_electrical, "%lf %s %s\n", &circuit_voltage, name, unit);
133  printf("%s\t\t%f\t%s\n", name, circuit_voltage, unit);
134 
135  /*parameters for serdes*/
136  fscanf(parameter_flie_electrical, "%s\n", name);
137  printf("%s\n", name);
138  fscanf(parameter_flie_electrical, "%lf %s %s\n", &serdes_cur_electrical, name, unit);
139  printf("%s\t%f\t%s\n", name, serdes_cur_electrical, unit);
140  fscanf(parameter_flie_electrical, "%lf %s %s\n", &serdes_area_electrical, name, unit);
141  printf("%s\t%f\t%s\n", name, serdes_area_electrical, unit);
142  printf("\n");
143 
144  fclose(parameter_flie_electrical);
145 }
146 
147 /*this is to read the configuration from the file configuration_electrical.txt*/
148 void read_configuration_electrical() {
149  char name[50];
150  char unit[20];
151 
152  // A really wired BUG here. Still don't know why this doean't work
153  // Segfault is thrown with the file handler non-null
154  // configuration_file_electrical = fopen("configuration_electrical.txt", "r");
155  // if (configuration_file_electrical == NULL) {
156  // printf("Cannot open file configuration_electrical.txt\n");
157  // }
158  // fscanf(configuration_file_electrical, "%s\n", name);
159  // printf("A word %s is read.", name);
160 
161  using namespace std;
162  ifstream parameter_flie_electrical("../config/configuration_electrical.txt");
163 
164  /*skip the text file head.*/
165  for (int i = 0; i < 10; i++) {
166  string line;
167  getline(parameter_flie_electrical, line);
168  }
169 
170  // for (int i = 0; i < 37; i++) {
171  // fscanf(configuration_file_electrical, "%s\n", name);
172  // }
173  /*data for configuration*/
174  // fscanf(configuration_file_electrical, "%lf %s %s\n", &data_rate_electrical, name, unit);
175 
176  parameter_flie_electrical >> data_rate_electrical;
177  parameter_flie_electrical >> name;
178  parameter_flie_electrical >> unit;
179  printf("%s\t%f\t%s\n", name, data_rate_electrical, unit);
180  parameter_flie_electrical >> length_electrical;
181  parameter_flie_electrical >> name;
182  parameter_flie_electrical >> unit;
183  printf("%s\t%f\t%s\n", name, length_electrical, unit);
184  parameter_flie_electrical >> serdes_ratio_electrical;
185  parameter_flie_electrical >> name;
186  parameter_flie_electrical >> unit;
187  printf("%s\t%d\t\t%s\n", name, serdes_ratio_electrical, unit);
188  parameter_flie_electrical >> number_of_parallel_traces;
189  parameter_flie_electrical >> name;
190  parameter_flie_electrical >> unit;
191  printf("%s\t\t%d\t\t%s\n", name, number_of_parallel_traces, unit);
192  printf("\n");
193 
194  parameter_flie_electrical.close();
195 }
196 
197 /*this is to write the calculated results to the file output_electrical.txt*/
198 void write_result_electrical() {
199  printf("Electrical:\n");
200  if ((output_file_electrical = fopen("output_electrical.txt", "w")) == NULL) {
201  printf("Cannot open file output_electrical.txt\n");
202  }
203 
204  /*writing heads*/
205  fprintf(output_file_electrical, "/*********************************************************************************");
206  fprintf(output_file_electrical, "\n *");
207  fprintf(output_file_electrical, "\n * File name: output_electrical.txt");
208  fprintf(output_file_electrical, "\n * Version: 3.0");
209  fprintf(output_file_electrical, "\n * Software: OEIL");
210  fprintf(output_file_electrical, "\n * Authors: Zhehui Wang, Jiang Xu ");
211  fprintf(output_file_electrical, "\n * Website: http://www.ece.ust.hk/~eexu/");
212  fprintf(output_file_electrical, "\n * The copyright information of this program can be found in the file COPYRIGHT.");
213  fprintf(output_file_electrical, "\n *");
214  fprintf(output_file_electrical, "\n *********************************************************************************/");
215  fprintf(output_file_electrical, "\n");
216 
217  /*output data written on file*/
218  printf("sensitivity_la\t\t%lf\tmW\n", sensitivity_la);
219  fprintf(output_file_electrical, "sensitivity_la\t\t%lf\tmW\n", sensitivity_la);
220  printf("crosstalk_coefficient\t%lf\tN/A\n", crosstalk_coefficient_electrical);
221  fprintf(output_file_electrical, "crosstalk_coefficient\t%lf\tN/A\n", crosstalk_coefficient_electrical);
222  printf("total_attenuation\t%lf\tN/A\n", total_attenuation_electrical);
223  fprintf(output_file_electrical, "total_attenuation\t%lf\tN/A\n", total_attenuation_electrical);
224  printf("\t\t\t%lf\tdB\n", -10 * log10(total_attenuation_electrical));
225  fprintf(output_file_electrical, "\t\t\t%lf\tdB\n", -10 * log10(total_attenuation_electrical));
226  printf("energy_consumption\t%lf\tpJ/bit\n", energy_consumption_electrical);
227  fprintf(output_file_electrical, "energy_consumption\t%lf\tpJ/bit\n", energy_consumption_electrical);
228  printf("area_density\t\t%lf\tGbps/mm^2\n", area_density_electrical);
229  fprintf(output_file_electrical, "area_density\t\t%lf\tGbps/mm^2\n", area_density_electrical);
230  printf("linear_density\t\t%lf\tGbps/mm\n", linear_density_electrical);
231  fprintf(output_file_electrical, "linear_density\t\t%lf\tGbps/mm\n", linear_density_electrical);
232  printf("area\t\t\t%lf\tmm^2\n", area_electrical);
233  fprintf(output_file_electrical, "area\t\t\t%lf\tmm^2\n", area_electrical);
234  printf("latency\t\t\t%lf\tns\n", latency_value_electrical);
235  fprintf(output_file_electrical, "latency\t\t\t%lf\tns\n", latency_value_electrical);
236  printf("\n");
237  fclose(output_file_electrical);
238 }
239 
240 #endif /* DEFINITION_ELECTRICAL_H */