block memory cleanup

This commit is contained in:
Wolfgang Spraul 2013-02-23 09:14:56 -05:00
parent 153e764bf1
commit 4e2a03023a
4 changed files with 195 additions and 93 deletions

View File

@ -1043,31 +1043,14 @@ fail:
static int dump_bram(struct fpga_config *cfg)
{
int row, i, j, off, newline;
int row, i;
newline = 0;
for (row = 0; row < 4; row++) {
for (i = 0; i < XC6_BRAM_DATA_DEVS_PER_ROW; i++) {
for (j = 0; j < XC6_BRAM_DATA_FRAMES_PER_DEV*FRAME_SIZE; j++) {
if (cfg->bits.d[BRAM_DATA_START
+ (row*XC6_BRAM_DATA_DEVS_PER_ROW+i)
*XC6_BRAM_DATA_FRAMES_PER_DEV*FRAME_SIZE
+ j])
break;
}
if (j >= XC6_BRAM_DATA_FRAMES_PER_DEV*FRAME_SIZE)
continue;
if (!newline) {
newline = 1;
printf("\n");
}
printf("br%i ramb16 i%i\n", row, i);
printf("{\n");
off = BRAM_DATA_START
+ (row*XC6_BRAM_DATA_DEVS_PER_ROW+i)
*XC6_BRAM_DATA_FRAMES_PER_DEV*FRAME_SIZE;
printf_ramb16_data(cfg->bits.d, off);
printf("}\n");
for (row = 3; row >= 0; row--) {
for (i = XC6_BRAM16_DEVS_PER_ROW-1; i >= 0; i--) {
printf_ramb_data(&cfg->bits.d[BRAM_DATA_START
+ (row*XC6_BRAM16_DEVS_PER_ROW+i)
*XC6_BRAM_DATA_FRAMES_PER_DEV*FRAME_SIZE],
row, i);
}
}
return 0;

View File

@ -79,7 +79,7 @@ void dump_data(int indent, const uint8_t *data, int len, int base)
}
// returns a 16-bit word (0:15) plus 2 bits parity in bits 16 & 17
static int get_ramb_word_with_parity(void *d, int word_idx)
static int get_ramb_word_with_parity(const void *d, int word_idx)
{
int w, i, bit_pos;
@ -100,7 +100,7 @@ static int get_ramb_word_with_parity(void *d, int word_idx)
// src points to 16+2 (=18) bit words, dest must hold enough space
// for num_words words.
static void ramb_data_to_words(int *dest, void *src, int num_words)
static void ramb_data_to_words(int *dest, const void *src, int num_words)
{
int i;
for (i = 0; i < num_words; i++)
@ -471,92 +471,209 @@ void printf_type2(uint8_t *d, int len, int inpos, int num_entries)
}
}
void printf_ramb16_data(uint8_t *bits, int inpos)
static int ramb_words_to_bram16(uint16_t (*init_data)[64][16], uint16_t (*init_parity)[8][16], int (*ramb_words)[1024])
{
int init_i, i, j, bits_set;
bits_set = 0;
// prepare parity words for string printf
for (init_i = 0; init_i < 8; init_i++) {
for (i = 0; i < 16; i++) { // 16 uint16_t words in one ramb16 parity string
(*init_parity)[init_i][i] = 0;
// 2 parity bits from each word, so 2*4=8 words have
// to be processed for 16 parity bits
for (j = 0; j < 4; j++) {
if ((*ramb_words)[64*init_i + 4*i + j] & (1<<16))
(*init_parity)[init_i][i] |= 1<<(j*4+0);
if ((*ramb_words)[64*init_i + 4*i + j] & (1<<17))
(*init_parity)[init_i][i] |= 1<<(j*4+1);
if ((*ramb_words)[512 + 64*init_i + 4*i + j] & (1<<16))
(*init_parity)[init_i][i] |= 1<<(j*4+2);
if ((*ramb_words)[512 + 64*init_i + 4*i + j] & (1<<17))
(*init_parity)[init_i][i] |= 1<<(j*4+3);
}
if ((*init_parity)[init_i][i])
bits_set = 1;
}
}
// prepare data words for string printf
for (init_i = 0; init_i < 64; init_i++) {
for (i = 0; i < 8; i++) {
(*init_data)[init_i][i*2] = (*ramb_words)[init_i*8 + i];
(*init_data)[init_i][i*2+1] = (*ramb_words)[512 + init_i*8 + i];
if ((*init_data)[init_i][i*2]
|| (*init_data)[init_i][i*2+1])
bits_set = 1;
}
}
return bits_set;
}
static int ramb_words_to_bram8(uint16_t (*init_data)[64][16], uint16_t (*init_parity)[8][16], int (*ramb_words)[1024])
{
int init_i, i, j, devs_used;
devs_used = 0; // bit1 = dev0, bit2 = dev1
// prepare parity words (0:3 are for the first bram8 device, 4:7 for the second one)
for (init_i = 0; init_i < 8; init_i++) {
for (i = 0; i < 16; i++) { // 16 uint16_t words in one ramb16 parity string
(*init_parity)[init_i][i] = 0;
// 2 parity bits from each word, so 2*4=8 words have
// to be processed for 16 parity bits
for (j = 0; j < 8; j++) {
if ((*ramb_words)[128*init_i + 8*i + j] & (1<<16))
(*init_parity)[init_i][i] |= 1<<(j*2+0);
if ((*ramb_words)[128*init_i + 8*i + j] & (1<<17))
(*init_parity)[init_i][i] |= 1<<(j*2+1);
}
if ((*init_parity)[init_i][i])
devs_used |= (init_i < 4) ? 0x01 : 0x02;
}
}
// prepare data words (0:31 are for the first bram8 device, 32:63 for the second one)
for (init_i = 0; init_i < 64; init_i++) {
for (i = 0; i < 16; i++) {
(*init_data)[init_i][i] = (*ramb_words)[init_i*16 + i];
if ((*init_data)[init_i][i])
devs_used |= (init_i < 32) ? 0x01 : 0x02;
}
}
return devs_used;
}
void printf_ramb_data(const uint8_t *bits, int row, int bram_idx)
{
int nonzero_head, nonzero_tail, ramb_words[1024];
uint16_t init_data16[64][16], init_parity16[8][16];
int i, j, init_i;
uint16_t init_data[64][16], init_parity[8][16];
int i, j, devs_used;
// check head and tail
nonzero_head = 0;
for (i = 0; i < XC6_BRAM_DATA_PREFIX_LEN; i++) {
if (bits[inpos + i]) {
if (bits[i]) {
nonzero_head = 1;
break;
}
}
nonzero_tail = 0;
for (i = 0; i < XC6_BRAM_DATA_SUFFIX_LEN; i++) {
if (bits[inpos + XC6_BRAM_DATA_FRAMES_PER_DEV*FRAME_SIZE-XC6_BRAM_DATA_SUFFIX_LEN + i]) {
if (bits[XC6_BRAM_DATA_FRAMES_PER_DEV*FRAME_SIZE-XC6_BRAM_DATA_SUFFIX_LEN + i]) {
nonzero_tail = 1;
break;
}
}
if (nonzero_head || nonzero_tail)
printf(" #W Unexpected data.\n");
if (nonzero_head) {
printf(" head");
for (i = 0; i < XC6_BRAM_DATA_PREFIX_LEN; i++)
printf(" %02X", bits[inpos + i]);
printf("\n");
}
if (nonzero_tail) {
printf(" tail");
for (i = 0; i < XC6_BRAM_DATA_SUFFIX_LEN; i++)
printf(" %02X", bits[inpos + XC6_BRAM_DATA_FRAMES_PER_DEV*FRAME_SIZE-XC6_BRAM_DATA_SUFFIX_LEN + i]);
printf("\n");
}
ramb_data_to_words(ramb_words, &bits[inpos+18], sizeof(ramb_words)/sizeof(*ramb_words));
// prepare parity words for string printf
for (init_i = 0; init_i < 8; init_i++) {
for (i = 0; i < 16; i++) { // 16 uint16_t words in one ramb16 parity string
init_parity16[init_i][i] = 0;
// 2 parity bits from each word, so 2*4=8 words have
// to be processed for 16 parity bits
for (j = 0; j < 4; j++) {
if (ramb_words[64*init_i + 4*i + j] & (1<<16))
init_parity16[init_i][i] |= 1<<(j*4+0);
if (ramb_words[64*init_i + 4*i + j] & (1<<17))
init_parity16[init_i][i] |= 1<<(j*4+1);
if (ramb_words[512 + 64*init_i + 4*i + j] & (1<<16))
init_parity16[init_i][i] |= 1<<(j*4+2);
if (ramb_words[512 + 64*init_i + 4*i + j] & (1<<17))
init_parity16[init_i][i] |= 1<<(j*4+3);
}
if (nonzero_head || nonzero_tail) {
PHERE();
if (nonzero_head) {
printf(" head");
for (i = 0; i < XC6_BRAM_DATA_PREFIX_LEN; i++)
printf(" %02X", bits[i]);
printf("\n");
}
if (nonzero_tail) {
printf(" tail");
for (i = 0; i < XC6_BRAM_DATA_SUFFIX_LEN; i++)
printf(" %02X", bits[XC6_BRAM_DATA_FRAMES_PER_DEV*FRAME_SIZE-XC6_BRAM_DATA_SUFFIX_LEN + i]);
printf("\n");
}
}
// prepare data words for string printf
for (init_i = 0; init_i < 64; init_i++) {
ramb_data_to_words(ramb_words, &bits[18], sizeof(ramb_words)/sizeof(*ramb_words));
// ramb16
devs_used = ramb_words_to_bram16(&init_data, &init_parity, &ramb_words);
if (devs_used) {
printf("br%i maj_i %i dev_i %i/16\n", row,
bram_idx/XC6_BRAM16_DEVS_PER_MAJOR,
bram_idx%XC6_BRAM16_DEVS_PER_MAJOR);
printf("{\n");
for (i = 0; i < 8; i++) {
init_data16[init_i][i*2] = ramb_words[init_i*8 + i];
init_data16[init_i][i*2+1] = ramb_words[512 + init_i*8 + i];
}
}
// print parity strings
for (init_i = 0; init_i < 8; init_i++) {
for (i = 0; i < 16; i++) {
if (init_parity16[init_i][i]) {
printf(" parity 0x%02X \"", init_i);
for (i = 0; i < 16; i++)
printf("%04X", init_parity16[init_i][15-i]);
printf("\"\n");
break;
for (j = 0; j < 16; j++) {
if (init_parity[i][j]) {
printf(" parity 0x%02X \"", i);
for (j = 0; j < 16; j++)
printf("%04X", init_parity[i][15-j]);
printf("\"\n");
break;
}
}
}
}
// print data strings
for (init_i = 0; init_i < 64; init_i++) {
for (i = 0; i < 16; i++) {
if (init_data16[init_i][i]) {
printf(" init 0x%02X \"", init_i);
for (i = 0; i < 16; i++)
printf("%04X", init_data16[init_i][15-i]);
printf("\"\n");
break;
for (i = 0; i < 64; i++) {
for (j = 0; j < 16; j++) {
if (init_data[i][j]) {
printf(" init 0x%02X \"", i);
for (j = 0; j < 16; j++)
printf("%04X", init_data[i][15-j]);
printf("\"\n");
break;
}
}
}
printf("}\n");
}
devs_used = ramb_words_to_bram8(&init_data, &init_parity, &ramb_words);
// ramb8,0
if (devs_used & 0x01) {
printf("br%i maj_i %i dev_i %i,0/8\n", row,
bram_idx/XC6_BRAM16_DEVS_PER_MAJOR,
bram_idx%XC6_BRAM16_DEVS_PER_MAJOR);
printf("{\n");
for (i = 0; i < 4; i++) {
for (j = 0; j < 16; j++) {
if (init_parity[i][j]) {
printf(" parity 0x%02X \"", i);
for (j = 0; j < 16; j++)
printf("%04X", init_parity[i][15-j]);
printf("\"\n");
break;
}
}
}
for (i = 0; i < 32; i++) {
for (j = 0; j < 16; j++) {
if (init_data[i][j]) {
printf(" init 0x%02X \"", i);
for (j = 0; j < 16; j++)
printf("%04X", init_data[i][15-j]);
printf("\"\n");
break;
}
}
}
printf("}\n");
}
// ramb8,1
if (devs_used & 0x02) {
printf("br%i maj_i %i dev_i %i,1/8\n", row,
bram_idx/XC6_BRAM16_DEVS_PER_MAJOR,
bram_idx%XC6_BRAM16_DEVS_PER_MAJOR);
printf("{\n");
for (i = 4; i < 8; i++) {
for (j = 0; j < 16; j++) {
if (init_parity[i][j]) {
printf(" parity 0x%02X \"", i-4);
for (j = 0; j < 16; j++)
printf("%04X", init_parity[i][15-j]);
printf("\"\n");
break;
}
}
}
for (i = 32; i < 64; i++) {
for (j = 0; j < 16; j++) {
if (init_data[i][j]) {
printf(" init 0x%02X \"", i-32);
for (j = 0; j < 16; j++)
printf("%04X", init_data[i][15-j]);
printf("\"\n");
break;
}
}
}
printf("}\n");
}
}
@ -1083,8 +1200,7 @@ int all_zero(const void* d, int num_bytes)
return 1;
}
void printf_wrap(FILE* f, char* line, int prefix_len,
const char* fmt, ...)
void printf_wrap(FILE* f, char* line, int prefix_len, const char* fmt, ...)
{
va_list list;
int i;

View File

@ -78,7 +78,7 @@ const char* bool_bits2str(uint64_t u64, int num_bits);
int bool_req_pins(uint64_t u64, int num_bits);
void printf_type2(uint8_t* d, int len, int inpos, int num_entries);
void printf_ramb16_data(uint8_t* bits, int inpos);
void printf_ramb_data(const uint8_t *bits, int row, int bram_idx);
int is_empty(const uint8_t* d, int l);
int count_set_bits(const uint8_t* d, int l);

View File

@ -229,7 +229,10 @@ const char *xc6_find_pkg_pin(const struct xc6_pkg_info *pkg_info, const char *de
#define XC6_IOB_SUSP_3STATE_PULLDOWN 0x0000000000000008
#define XC6_IOB_SUSP_LAST_VAL 0x0000000000000010
#define XC6_BRAM_DATA_DEVS_PER_ROW 8
#define XC6_BRAM_MAJORS 2
#define XC6_BRAM16_DEVS_PER_MAJOR 4
#define XC6_BRAM16_DEVS_PER_ROW (XC6_BRAM_MAJORS*XC6_BRAM16_DEVS_PER_MAJOR)
#define XC6_BRAM_DATA_FRAMES_PER_DEV 18
#define XC6_BRAM_DATA_PREFIX_LEN 18
#define XC6_BRAM_DATA_SUFFIX_LEN 18