43#include "connection_list.h"
47static void init_data (
double* data, uint32_t size,
double init_value)
49 while (size--) *data++ = init_value ;
76 StackElementListNode_t *stkeln ;
77 for (stkeln = stack_elements_list->First ;
79 stkeln = stkeln->Next)
90 FloorplanElementListNode_t *ele_flp ;
94 ele_flp = ele_flp->Next)
97 discr_x_element = ele_flpi->
ICElements.First->Data.Discr_X;
98 discr_y_element = ele_flpi->
ICElements.First->Data.Discr_Y;
99 if (discr_x_element != 0 && discr_y_element != 0)
101 cell_num_die += discr_x_element*discr_y_element;
105 cell_num_die += discr_x_die*discr_y_die;
106 ele_flpi->
ICElements.First->Data.Discr_X = discr_x_die;
107 ele_flpi->
ICElements.First->Data.Discr_Y = discr_y_die;
110 cell_num_die = cell_num_die*stkel->
NLayers;
111 cell_num_non_uniform += cell_num_die;
118 cell_num_non_uniform += discr_x*discr_y;
128 fprintf (stderr,
"Unsupported stack element type\n") ;
133 fprintf (stderr,
"Unsupported stack element type\n") ;
149 dimensions->
Grid.
NCells = cell_num_non_uniform;
160 StackElementListNode_t *stkeln ;
161 for (stkeln = stack_elements_list->Last ;
163 stkeln = stkeln->Prev)
178 for (
CellIndex_t layer_index = 0; layer_index< total_layer_number_die; layer_index++)
181 FloorplanElementListNode_t *ele_flp ;
184 ele_flp = ele_flp->Next)
187 discr_x_element = ele_flpi->
ICElements.First->Data.Discr_X;
188 discr_y_element = ele_flpi->
ICElements.First->Data.Discr_Y;
190 if (discr_x_element == 0 || discr_y_element == 0)
192 discr_x_element = discr_x_die;
193 discr_y_element = discr_y_die;
195 cell_num_layer = discr_x_element*discr_y_element;
206 for (
CellIndex_t sub_element = 0; sub_element < cell_num_layer; sub_element++)
208 position_info_index = sub_element+cell_num_non_uniform;
209 discr_x_position = sub_element % discr_x_element;
210 discr_y_position = sub_element / discr_x_element;
212 position_info[position_info_index][0] = ori_element_x + (ori_element_length/discr_x_element)*discr_x_position;
213 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y_element)*discr_y_position;
215 position_info[position_info_index][2] = ori_element_x + (ori_element_length/discr_x_element)*(discr_x_position + 1);
216 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y_element)*(discr_y_position + 1);
219 new_cell.layer_info = current_layer;
220 new_cell.left_x = position_info[position_info_index][0] ;
221 new_cell.left_y = position_info[position_info_index][1] ;
222 new_cell.length = position_info[position_info_index][2] - position_info[position_info_index][0];
223 new_cell.width = position_info[position_info_index][3] - position_info[position_info_index][1];
224 non_uniform_cell_list_insert_end(&dimensions->
Cell_list, &new_cell);
227 cell_num_non_uniform += cell_num_layer;
232 ele_flpi->
ICElements.First->Data.Index_start = cell_num_non_uniform-cell_num_layer;
233 ele_flpi->
ICElements.First->Data.Index_end = cell_num_non_uniform-1;
237 layer_cell_record[current_layer] = cell_num_non_uniform;
238 layer_type_record[current_layer] = 0;
248 cell_num_layer = discr_x*discr_y;
257 for (
CellIndex_t sub_element = 0; sub_element < cell_num_layer; sub_element++)
259 position_info_index = sub_element+cell_num_non_uniform;
260 discr_x_position = sub_element % discr_x;
261 discr_y_position = sub_element / discr_x;
263 position_info[position_info_index][0] = ori_element_x + (ori_element_length/discr_x)*discr_x_position;
264 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
266 position_info[position_info_index][2] = ori_element_x + (ori_element_length/discr_x)*(discr_x_position + 1);
267 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
270 new_cell.layer_info = current_layer;
271 new_cell.left_x = position_info[position_info_index][0] ;
272 new_cell.left_y = position_info[position_info_index][1] ;
273 new_cell.length = position_info[position_info_index][2] - position_info[position_info_index][0];
274 new_cell.width = position_info[position_info_index][3] - position_info[position_info_index][1];
275 non_uniform_cell_list_insert_end(&dimensions->
Cell_list, &new_cell);
278 cell_num_non_uniform += cell_num_layer;
279 layer_cell_record[current_layer] = cell_num_non_uniform;
280 layer_type_record[current_layer] = 0;
290 cell_num_layer = discr_x*discr_y;
307 for (
CellIndex_t sub_element = 0; sub_element < cell_num_layer; sub_element++)
310 position_info_index = sub_element+cell_num_non_uniform;
311 discr_x_position = sub_element % discr_x;
312 discr_y_position = sub_element / discr_x;
313 if (discr_x_position == 0)
316 position_info[position_info_index][0] = 0.0;
317 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
320 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
322 else if (discr_x_position == discr_x-1)
326 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
328 position_info[position_info_index][2] = dimensions->
Chip.
Length;
329 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
333 if (discr_x_position % 2 != 0)
336 CellIndex_t index_channel = (discr_x_position-1)/2;
338 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
340 position_info[position_info_index][2] = position_info[position_info_index][0] + dimensions->
Cell.
ChannelLength;;
341 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
349 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
351 position_info[position_info_index][2] = position_info[position_info_index][0] + dimensions->
Cell.
WallLength;
352 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
359 new_cell.layer_info = current_layer;
360 new_cell.left_x = position_info[position_info_index][0] ;
361 new_cell.left_y = position_info[position_info_index][1] ;
362 new_cell.length = position_info[position_info_index][2] - position_info[position_info_index][0];
363 new_cell.width = position_info[position_info_index][3] - position_info[position_info_index][1];
365 new_cell.isChannel = 1;
366 non_uniform_cell_list_insert_end(&dimensions->
Cell_list, &new_cell);
369 cell_num_non_uniform += cell_num_layer;
370 layer_cell_record[current_layer] = cell_num_non_uniform;
371 if (layer_i == 0 || layer_i == 3)
372 layer_type_record[current_layer] = 1;
374 layer_type_record[current_layer] = 2;
384 cell_num_layer = discr_x*discr_y;
401 for (
CellIndex_t sub_element = 0; sub_element < cell_num_layer; sub_element++)
404 position_info_index = sub_element+cell_num_non_uniform;
405 discr_x_position = sub_element % discr_x;
406 discr_y_position = sub_element / discr_x;
407 if (discr_x_position == 0)
410 position_info[position_info_index][0] = 0.0;
411 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
414 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
416 else if (discr_x_position == discr_x-1)
420 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
422 position_info[position_info_index][2] = dimensions->
Chip.
Length;
423 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
427 if (discr_x_position % 2 != 0)
430 CellIndex_t index_channel = (discr_x_position-1)/2;
432 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
434 position_info[position_info_index][2] = position_info[position_info_index][0] + dimensions->
Cell.
ChannelLength;;
435 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
443 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
445 position_info[position_info_index][2] = position_info[position_info_index][0] + dimensions->
Cell.
WallLength;
446 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
453 new_cell.layer_info = current_layer;
454 new_cell.left_x = position_info[position_info_index][0] ;
455 new_cell.left_y = position_info[position_info_index][1] ;
456 new_cell.length = position_info[position_info_index][2] - position_info[position_info_index][0];
457 new_cell.width = position_info[position_info_index][3] - position_info[position_info_index][1];
459 new_cell.isChannel = 1;
460 non_uniform_cell_list_insert_end(&dimensions->
Cell_list, &new_cell);
463 cell_num_non_uniform += cell_num_layer;
464 layer_cell_record[current_layer] = cell_num_non_uniform;
465 if (layer_i == 0 || layer_i == 3)
467 layer_type_record[current_layer] = 1;
469 else if (layer_i == 1)
471 layer_type_record[current_layer] = 3;
475 layer_type_record[current_layer] = 2;
486 cell_num_layer = discr_x*discr_y;
496 for (
CellIndex_t sub_element = 0; sub_element < cell_num_layer; sub_element++)
498 position_info_index = sub_element+cell_num_non_uniform;
499 discr_x_position = sub_element % discr_x;
500 discr_y_position = sub_element / discr_x;
501 if (discr_x_position == 0)
505 position_info[position_info_index][0] = 0.0;
506 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
509 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
511 else if (discr_x_position == discr_x-1)
516 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
518 position_info[position_info_index][2] = dimensions->
Chip.
Length;
519 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
523 if (discr_x_position % 2 != 0)
527 CellIndex_t index_channel = (discr_x_position-1)/2;
529 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
531 position_info[position_info_index][2] = position_info[position_info_index][0] + dimensions->
Cell.
ChannelLength;;
532 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
541 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
543 position_info[position_info_index][2] = position_info[position_info_index][0] + dimensions->
Cell.
WallLength;
544 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
551 new_cell.layer_info = current_layer;
552 new_cell.left_x = position_info[position_info_index][0] ;
553 new_cell.left_y = position_info[position_info_index][1] ;
554 new_cell.length = position_info[position_info_index][2] - position_info[position_info_index][0];
555 new_cell.width = position_info[position_info_index][3] - position_info[position_info_index][1];
557 new_cell.isChannel = 1;
558 non_uniform_cell_list_insert_end(&dimensions->
Cell_list, &new_cell);
561 cell_num_non_uniform += cell_num_layer;
562 layer_cell_record[current_layer] = cell_num_non_uniform;
563 layer_type_record[current_layer] = 0;
571 fprintf (stderr,
"Unsupported stack element type\n") ;
576 fprintf (stderr,
"Unsupported stack element type\n") ;
589 cell_num_layer = discr_x*discr_y;
598 for (
CellIndex_t sub_element = 0; sub_element < cell_num_layer; sub_element++)
600 position_info_index = sub_element+cell_num_non_uniform;
601 discr_x_position = sub_element % discr_x;
602 discr_y_position = sub_element / discr_x;
604 position_info[position_info_index][0] = ori_element_x + (ori_element_length/discr_x)*discr_x_position;
605 position_info[position_info_index][1] = ori_element_y + (ori_element_width/discr_y)*discr_y_position;
607 position_info[position_info_index][2] = ori_element_x + (ori_element_length/discr_x)*(discr_x_position + 1);
608 position_info[position_info_index][3] = ori_element_y + (ori_element_width/discr_y)*(discr_y_position + 1);
611 new_cell.layer_info = current_layer;
612 new_cell.left_x = position_info[position_info_index][0] ;
613 new_cell.left_y = position_info[position_info_index][1] ;
614 new_cell.length = position_info[position_info_index][2] - position_info[position_info_index][0];
615 new_cell.width = position_info[position_info_index][3] - position_info[position_info_index][1];
616 non_uniform_cell_list_insert_end(&dimensions->
Cell_list, &new_cell);
619 cell_num_non_uniform += cell_num_layer;
620 layer_cell_record[current_layer] = cell_num_non_uniform;
621 layer_type_record[current_layer] = 4;
631 minkowski_diff[0] = position_info[i_x][0] - position_info[i_y][2];
632 minkowski_diff[1] = position_info[i_x][1] - position_info[i_y][3];
633 minkowski_diff[2] = position_info[i_x][2] - position_info[i_y][0];
634 minkowski_diff[3] = position_info[i_x][3] - position_info[i_y][1];
641 ChipDimension_t length = (fabs(minkowski_diff[0]) <= fabs(minkowski_diff[2])) ? fabs(minkowski_diff[0]) : fabs(minkowski_diff[2]);
642 ChipDimension_t width = (fabs(minkowski_diff[1]) <= fabs(minkowski_diff[3])) ? fabs(minkowski_diff[1]) : fabs(minkowski_diff[3]);
643 ChipDimension_t node1_length = position_info_ptr[i_x][2]-position_info_ptr[i_x][0];
644 ChipDimension_t node1_width = position_info_ptr[i_x][3]-position_info_ptr[i_x][1];
645 ChipDimension_t node2_length = position_info_ptr[i_y][2]-position_info_ptr[i_y][0];
646 ChipDimension_t node2_width = position_info_ptr[i_y][3]-position_info_ptr[i_y][1];
648 ChipDimension_t node_length = (node1_length <= node2_length) ? node1_length : node2_length;
649 ChipDimension_t node_width = (node1_width <= node2_width) ? node1_width : node2_width;
652 length = (length <= node_length) ? length : node_length;
653 width = (width <= node_width) ? width : node_width;
676 layer_end_index = layer_cell_record[layer_index];
677 layer_type = layer_type_record[layer_index];
678 if(layer_index == dimensions->
Grid.
NLayers && layer_type != 4)
681 for (
CellIndex_t i_x = layer_start_index; i_x < layer_end_index; i_x++)
683 for (
CellIndex_t i_y = i_x+1; i_y < layer_end_index; i_y++)
689 if (minkowski_diff[0] == 0 || minkowski_diff[1] == 0 || minkowski_diff[2] == 0 || minkowski_diff[3] == 0)
692 if (minkowski_diff[0] * minkowski_diff[2] + minkowski_diff[1] * minkowski_diff[3] < 0)
696 new_connection.node1 = i_x;
697 new_connection.node2 = i_y;
698 new_connection.node1_layer = layer_index;
699 new_connection.node2_layer = layer_index;
701 if (minkowski_diff[0] * minkowski_diff[2] == 0)
703 if (layer_type == 1 || layer_type == 2 || layer_type == 3)
705 new_connection.value = (fabs(minkowski_diff[1])<=fabs(minkowski_diff[3])) ? fabs(minkowski_diff[1]) : fabs(minkowski_diff[3]);
706 new_connection.direction = 1;
708 else if (minkowski_diff[1] * minkowski_diff[3] == 0)
710 if (layer_type == 1 || layer_type == 3)
712 new_connection.value = (fabs(minkowski_diff[0])<=fabs(minkowski_diff[2])) ? fabs(minkowski_diff[0]) : fabs(minkowski_diff[2]);
713 new_connection.direction = 2;
716 fprintf (stderr,
"Cannot determine interconnect length\n") ;
721 connection_list_insert_end(connections_list, &new_connection);
727 layer_start_index = layer_end_index;
753 bottom_layer_type = layer_type_record[layer_index-1];
754 top_layer_type = layer_type_record[layer_index];
755 if(layer_index == dimensions->
Grid.
NLayers && top_layer_type != 4)
757 if ( (bottom_layer_type == 2 && top_layer_type == 2) || (bottom_layer_type == 3 && top_layer_type == 2))
759 botom_layer_start_index = layer_cell_record[layer_index-3];
760 botom_layer_end_index = layer_cell_record[layer_index-2];
761 top_layer_start_index = layer_cell_record[layer_index-1];
762 top_layer_end_index = layer_cell_record[layer_index];
765 for (
CellIndex_t i_x = botom_layer_start_index; i_x < botom_layer_end_index; i_x++)
768 for (
CellIndex_t i_y = top_layer_start_index; i_y < top_layer_end_index; i_y++)
773 if (minkowski_diff[0] * minkowski_diff[2] < 0 && minkowski_diff[1] * minkowski_diff[3] < 0)
778 new_connection.node1 = i_x;
779 new_connection.node2 = i_y;
780 new_connection.node1_layer = layer_index-1;
781 new_connection.node2_layer = layer_index;
784 new_connection.value = get_overlap_area(minkowski_diff, position_info_ptr, i_x, i_y);
786 new_connection.direction = 0;
790 connection_list_insert_end(connections_list, &new_connection);
795 botom_layer_start_index = layer_cell_record[layer_index-2];
796 botom_layer_end_index = layer_cell_record[layer_index-1];
797 top_layer_start_index = layer_cell_record[layer_index];
798 top_layer_end_index = layer_cell_record[layer_index+1];
801 for (
CellIndex_t i_x = botom_layer_start_index; i_x < botom_layer_end_index; i_x++)
804 for (
CellIndex_t i_y = top_layer_start_index; i_y < top_layer_end_index; i_y++)
809 if (minkowski_diff[0] * minkowski_diff[2] < 0 && minkowski_diff[1] * minkowski_diff[3] < 0)
814 new_connection.node1 = i_x;
815 new_connection.node2 = i_y;
816 new_connection.node1_layer = layer_index-1;
817 new_connection.node2_layer = layer_index;
820 new_connection.value = get_overlap_area(minkowski_diff, position_info_ptr, i_x, i_y);
822 new_connection.direction = 0;
826 connection_list_insert_end(connections_list, &new_connection);
830 botom_layer_start_index = botom_layer_end_index;
834 botom_layer_end_index = layer_cell_record[layer_index-1];
835 top_layer_start_index = layer_cell_record[layer_index-1];
836 top_layer_end_index = layer_cell_record[layer_index];
839 for (
CellIndex_t i_x = botom_layer_start_index; i_x < botom_layer_end_index; i_x++)
842 for (
CellIndex_t i_y = top_layer_start_index; i_y < top_layer_end_index; i_y++)
847 if (minkowski_diff[0] * minkowski_diff[2] < 0 && minkowski_diff[1] * minkowski_diff[3] < 0)
852 new_connection.node1 = i_x;
853 new_connection.node2 = i_y;
854 new_connection.node1_layer = layer_index-1;
855 new_connection.node2_layer = layer_index;
858 new_connection.value = get_overlap_area(minkowski_diff, position_info_ptr, i_x, i_y);
860 new_connection.direction = 0;
864 connection_list_insert_end(connections_list, &new_connection);
868 botom_layer_start_index = top_layer_start_index;
879 StackElementList_t *stack_elements_list,
895 memset(layer_cell_record, 0,
sizeof layer_cell_record);
902 memset(layer_type_record, 0,
sizeof layer_type_record);
904 get_cell_position(position_info_ptr, layer_cell_record, layer_type_record, stack_elements_list, dimensions);
929 fprintf (stderr,
"Cannot malloc temperature array\n") ;
942 SLU_DN, SLU_D, SLU_GE) ;
950 fprintf (stderr,
"Cannot malloc thermal grid\n") ;
976 fprintf (stderr,
"Cannot malloc power grid\n") ;
999 fprintf (stderr,
"Cannot malloc syatem matrix\n") ;
1052static void fill_system_vector
1063#ifdef PRINT_SYSTEM_VECTOR
1069 *vector++ = *sources++
1070 + (*capacities++ / step_time)
1086 #ifdef PRINT_SYSTEM_VECTOR
1087 old = *temperatures ;
1090 *vector++ = *sources++
1091 + (*capacities++ / step_time)
1094 #ifdef PRINT_SYSTEM_VECTOR
1096 " l %2d r %4d c %4d [%7d] | %e [b] = %e [s] + %e [c] * %e [t]\n",
1099 *(vector-1), *(sources-1), *(capacities-1), old) ;
1109 for(row = 0; row < topSink->
NRows; row++)
1111 for(column = 0; column < topSink->
NColumns; column++)
1113 #ifdef PRINT_SYSTEM_VECTOR
1114 old = *temperatures ;
1117 *vector++ = *sources++
1118 + (*capacities++ / step_time)
1121 #ifdef PRINT_SYSTEM_VECTOR
1123 " r %4d c %4d [%7d] | %e [b] = %e [s] + %e [c] * %e [t]\n",
1126 *(vector-1), *(sources-1), *(capacities-1), old) ;
1136static void fill_system_vector_steady
1150 *vector++ = *sources++ ;
1160 *vector++ = *sources++ ;
1162 #ifdef PRINT_SYSTEM_VECTOR
1164 " l %2d r %4d c %4d [%7d] | %e [b] = %e [s]\n",
1167 *(vector-1), *(sources-1)) ;
1195 fprintf(stderr,
"Error: pluggable heatsink callback failed\n");
1202 for(i = 0; i < size; i++)
1203 sources[i] = - sources[i];
1224 #ifdef PRINT_DEBUG_INFO
1225 printf(
"sources info:\n");
1300 #ifdef PRINT_DEBUG_INFO
1301 printf(
"sources info:\n");
1309 "Warning: no power trace given for steady state simulation\n") ;
1369 (dimensions, layer_index, row_index, column_index) ;
1385 StackElementList_t *list,
1408 FILE *output_file = fopen (file_name,
"w") ;
1410 if (output_file == NULL)
1412 fprintf (stderr,
"Unable to open output file %s\n", file_name) ;
1421 fclose (output_file) ;
void increase_by_step_time(Analysis_t *analysis)
bool slot_completed(Analysis_t *analysis)
void connection_init(Connection_t *connection)
CellIndex_t get_number_of_connections(Dimensions_t *dimensions)
CellIndex_t get_cell_offset_in_stack(Dimensions_t *dimensions, CellIndex_t layer_index, CellIndex_t row_index, CellIndex_t column_index)
CellIndex_t get_spreader_cell_offset(Dimensions_t *dimensions, struct HeatSink_t *hsink, CellIndex_t row_index, CellIndex_t column_index)
CellIndex_t last_column(Dimensions_t *dimensions)
CellIndex_t get_number_of_cells(Dimensions_t *dimensions)
CellIndex_t last_layer(Dimensions_t *dimensions)
CellIndex_t first_layer(Dimensions_t *dimensions)
CellIndex_t first_column(Dimensions_t *dimensions)
CellIndex_t first_row(Dimensions_t *dimensions)
CellIndex_t last_row(Dimensions_t *dimensions)
#define FLOW_RATE_FROM_MLMIN_TO_UM3SEC(fr)
void power_grid_fill(PowerGrid_t *pgrid, ThermalGrid_t *tgrid, StackElementList_t *list, Dimensions_t *dimensions)
void update_channel_sources(PowerGrid_t *pgrid, Dimensions_t *dimensions)
Error_t power_grid_build(PowerGrid_t *pgrid, Dimensions_t *dimensions)
Error_t update_source_vector(PowerGrid_t *pgrid, Dimensions_t *dimensions)
void power_grid_init(PowerGrid_t *pgrid)
void power_grid_destroy(PowerGrid_t *pgrid)
void stack_element_destroy(StackElement_t *stkel)
void stack_element_init(StackElement_t *stkel)
void stack_element_print_thermal_map(StackElement_t *stkel, Dimensions_t *dimensions, Temperature_t *temperatures, FILE *stream)
void string_copy(String_t *dst, String_t *src)
Informations about the type of thermal simulation to be run, timing and its initial settings.
AnalysisType_t AnalysisType
Temperature_t InitialTemperature
CellDimension_t LastWallLength
CellDimension_t ChannelLength
CellDimension_t FirstWallLength
CellDimension_t WallLength
ChannelModel_t ChannelModel
CellIndex_t SourceLayerOffset
Collections of all the structures that are needed for the thermal simulation.
ConnectionList_t connections_list
Non_uniform_cellList_t Cell_list
Structure containing information about a floorplan element.
ICElementList_t ICElements
FloorplanElementList_t ElementsList
Structure used to store data about the heat dissipation through the top or bottom surfaces of the 2D/...
HeatSinkModel_t SinkModel
int(* PluggableHeatsink)(const double *spreadertemperatures, double *sinkheatflows)
Capacity_t * CellsCapacities
Structure used to store data about the stack element that compose the 2D/3D stack.
StackElementType_t SEType
Structure to collect data to run thermal simulations.
ThermalGrid_t ThermalGrid
Temperature_t * Temperatures
Error_t system_matrix_build(SystemMatrix_t *sysmatrix, CellIndex_t size, CellIndex_t nnz)
void system_matrix_init(SystemMatrix_t *sysmatrix)
void system_matrix_destroy(SystemMatrix_t *sysmatrix)
Error_t do_factorization(SystemMatrix_t *sysmatrix)
void fill_system_matrix(SystemMatrix_t *sysmatrix, ThermalGrid_t *thermal_grid, Analysis_t *analysis, Dimensions_t *dimensions)
Error_t solve_sparse_linear_system(SystemMatrix_t *sysmatrix, SuperMatrix *b)
void get_cell_position(ChipDimension_t(*position_info)[4], CellIndex_t *layer_cell_record, CellIndex_t *layer_type_record, StackElementList_t *stack_elements_list, Dimensions_t *dimensions)
void get_minkowski_difference(ChipDimension_t *minkowski_diff, ChipDimension_t(*position_info)[4], int i_x, int i_y)
void reset_thermal_state(ThermalData_t *tdata, Analysis_t *analysis)
void get_connections_in_layer(CellIndex_t *layer_cell_record, CellIndex_t *layer_type_record, ChipDimension_t(*position_info_ptr)[4], Dimensions_t *dimensions)
void get_connections_between_layer(CellIndex_t *layer_cell_record, CellIndex_t *layer_type_record, ChipDimension_t(*position_info_ptr)[4], Dimensions_t *dimensions)
SimResult_t emulate_slot(ThermalData_t *tdata, Dimensions_t *dimensions, Analysis_t *analysis)
SimResult_t emulate_step(ThermalData_t *tdata, Dimensions_t *dimensions, Analysis_t *analysis)
Temperature_t get_cell_temperature(ThermalData_t *tdata, Dimensions_t *dimensions, CellIndex_t layer_index, CellIndex_t row_index, CellIndex_t column_index)
void thermal_data_destroy(ThermalData_t *tdata)
void update_number_of_cells(Dimensions_t *dimensions, StackElementList_t *stack_elements_list)
Error_t update_coolant_flow_rate(ThermalData_t *tdata, Dimensions_t *dimensions, Analysis_t *analysis, CoolantFR_t new_flow_rate)
Error_t print_thermal_map(ThermalData_t *tdata, StackElementList_t *list, Dimensions_t *dimensions, String_t stack_element_id, String_t file_name)
Error_t thermal_data_build(ThermalData_t *tdata, StackElementList_t *list, Dimensions_t *dimensions, Analysis_t *analysis)
void thermal_data_init(ThermalData_t *tdata)
SimResult_t emulate_steady(ThermalData_t *tdata, Dimensions_t *dimensions, Analysis_t *analysis)
Error_t thermal_grid_build(ThermalGrid_t *tgrid, Dimensions_t *dimensions)
Error_t thermal_grid_fill(ThermalGrid_t *tgrid, StackElementList_t *list)
void thermal_grid_destroy(ThermalGrid_t *tgrid)
void thermal_grid_init(ThermalGrid_t *tgrid)
@ TDICE_SUCCESS
The function returns with success.
@ TDICE_FAILURE
The function retuerns with a generic error.
@ TDICE_CHANNEL_MODEL_PF_INLINE
Inline pin fins - 2 Resistors model.
@ TDICE_CHANNEL_MODEL_PF_STAGGERED
Staggered pin fins - 2 Resistors model.
@ TDICE_CHANNEL_MODEL_MC_2RM
Microchannel - 2 Resistors model.
@ TDICE_ANALYSIS_TYPE_TRANSIENT
Transient analysis.
@ TDICE_ANALYSIS_TYPE_STEADY
Steady state analysis.
@ TDICE_STACK_ELEMENT_NONE
Undefined type.
@ TDICE_STACK_ELEMENT_LAYER
Layer.
@ TDICE_STACK_ELEMENT_CHANNEL
Channel.
@ TDICE_STACK_ELEMENT_DIE
Die.
@ TDICE_HEATSINK_TOP_PLUGGABLE
Top pluggable heat sink.
@ TDICE_END_OF_SIMULATION