static int check_connects(int *num_uses_of_clb_pin, int *num_uses_of_sblk_opin, int *num_uses_of_ff_opin, t_subblock_data *subblock_data_ptr, int iblk) { /* Reset fanout counts. */ int i, num_subblocks, num_ffblocks, max_sub, subblock_lut_size, subblock_ff_size; int error = 0; t_subblock *subblock_inf; t_ffblock *ffblock_inf; subblock_inf = subblock_data_ptr->subblock_inf[iblk]; ffblock_inf = subblock_data_ptr->ffblock_inf[iblk]; num_subblocks = subblock_data_ptr->num_subblocks_per_block[iblk]; max_sub = subblock_data_ptr->max_subblocks_per_block; num_ffblocks = subblock_data_ptr->num_ff_per_block[iblk]; subblock_lut_size = subblock_data_ptr->subblock_lut_size; subblock_ff_size = subblock_data_ptr->subblock_ff_size; for (i = 0; i < pins_per_clb; i++) num_uses_of_clb_pin[i] = 0; for (i = 0; i < max_sub; i++) num_uses_of_sblk_opin[i] = 0; for (i = 0; i < max_sub * subblock_ff_size; i++) num_uses_of_ff_opin[i] = 0; load_one_clb_fanout_count(subblock_lut_size, subblock_inf, num_subblocks, num_uses_of_clb_pin, num_uses_of_sblk_opin, iblk, ffblock_inf, num_ffblocks, num_uses_of_ff_opin, max_sub); error += check_clb_to_subblock_connections(iblk, subblock_inf, ffblock_inf, num_subblocks, num_ffblocks, num_uses_of_clb_pin); error += check_internal_subblock_connections(subblock_data_ptr, iblk, num_uses_of_sblk_opin, num_uses_of_ff_opin); return (error); }
static int check_subblocks (int iblk, t_subblock_data *subblock_data_ptr, int *num_uses_of_clb_pin, int *num_uses_of_sblk_opin) { /* This routine checks the subblocks of iblk (which must be a CLB). It * * returns the number of errors found. */ int error, isub, ipin, clb_pin, i; int num_subblocks, max_subblocks_per_block, subblock_lut_size; t_subblock *subblock_inf; error = 0; subblock_inf = subblock_data_ptr->subblock_inf[iblk]; num_subblocks = subblock_data_ptr->num_subblocks_per_block[iblk]; max_subblocks_per_block = subblock_data_ptr->max_subblocks_per_block; subblock_lut_size = subblock_data_ptr->subblock_lut_size; if (num_subblocks < 1 || num_subblocks > max_subblocks_per_block) { printf("Error: block #%d (%s) contains %d subblocks.\n", iblk, block[iblk].name, num_subblocks); error++; } /* Check that all pins connect to the proper type of CLB pin and are in the * * correct range. */ for (isub=0;isub<num_subblocks;isub++) { for (ipin=0;ipin<subblock_lut_size;ipin++) { /* Input pins */ clb_pin = subblock_inf[isub].inputs[ipin]; error += check_subblock_pin (clb_pin, 0, pins_per_clb + num_subblocks - 1, RECEIVER, iblk, isub, subblock_inf); } /* Subblock output pin. */ clb_pin = subblock_inf[isub].output; error += check_subblock_pin (clb_pin, 0, pins_per_clb - 1, DRIVER, iblk, isub, subblock_inf); /* Subblock clock pin. */ clb_pin = subblock_inf[isub].clock; error += check_subblock_pin (clb_pin, 0, pins_per_clb + num_subblocks - 1, RECEIVER, iblk, isub, subblock_inf); } /* End subblock for loop. */ /* If pins out of range, return. Could get seg faults otherwise. */ if (error != 0) return (error); /* Reset fanout counts. */ for (i=0;i<pins_per_clb;i++) num_uses_of_clb_pin[i] = 0; for (i=0;i<num_subblocks;i++) num_uses_of_sblk_opin[i] = 0; load_one_clb_fanout_count (subblock_lut_size, subblock_inf, num_subblocks, num_uses_of_clb_pin, num_uses_of_sblk_opin, iblk); error += check_clb_to_subblock_connections (iblk, subblock_inf, num_subblocks, num_uses_of_clb_pin); error += check_internal_subblock_connections (subblock_data_ptr, iblk, num_uses_of_sblk_opin); return (error); }