some cleanup to prepare for block memory support
This commit is contained in:
parent
8a4402bbc8
commit
51c482ac52
392
libs/bit_regs.c
392
libs/bit_regs.c
|
@ -542,6 +542,143 @@ fail:
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int dump_maj_zero(const uint8_t* bits, int row, int major)
|
||||
{
|
||||
int minor;
|
||||
|
||||
for (minor = 0; minor < get_major_minors(XC6SLX9, major); minor++)
|
||||
printf_clock(&bits[minor*FRAME_SIZE], row, major, minor);
|
||||
for (minor = 0; minor < get_major_minors(XC6SLX9, major); minor++)
|
||||
printf_frames(&bits[minor*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, minor, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dump_maj_left(const uint8_t* bits, int row, int major)
|
||||
{
|
||||
int minor;
|
||||
|
||||
for (minor = 0; minor < get_major_minors(XC6SLX9, major); minor++)
|
||||
printf_clock(&bits[minor*FRAME_SIZE], row, major, minor);
|
||||
for (minor = 0; minor < get_major_minors(XC6SLX9, major); minor++)
|
||||
printf_frames(&bits[minor*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, minor, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dump_maj_right(const uint8_t* bits, int row, int major)
|
||||
{
|
||||
int minor;
|
||||
|
||||
for (minor = 0; minor < get_major_minors(XC6SLX9, major); minor++)
|
||||
printf_clock(&bits[minor*FRAME_SIZE], row, major, minor);
|
||||
for (minor = 0; minor < get_major_minors(XC6SLX9, major); minor++)
|
||||
printf_frames(&bits[minor*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, minor, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dump_maj_logic(const uint8_t* bits, int row, int major)
|
||||
{
|
||||
const struct xc_die* xci = xc_die_info(XC6SLX9);
|
||||
int minor, i, logdev_start, logdev_end;
|
||||
|
||||
for (minor = 0; minor < xci->majors[major].minors; minor++)
|
||||
printf_clock(&bits[minor*FRAME_SIZE], row, major, minor);
|
||||
|
||||
// 0:19 routing minor pairs
|
||||
for (i = 0; i < 10; i++)
|
||||
printf_routing_2minors(&bits[i*2*FRAME_SIZE], row, major, i*2);
|
||||
|
||||
// mi20 as 64-char 0/1 string
|
||||
printf_v64_mi20(&bits[20*FRAME_SIZE], row, major);
|
||||
|
||||
logdev_start = 0;
|
||||
logdev_end = 15;
|
||||
if (xci->majors[major].flags & XC_MAJ_TOP_BOT_IO) {
|
||||
if (row == xc_die_info(XC6SLX9)->num_rows-1)
|
||||
logdev_start += TOPBOT_IO_ROWS;
|
||||
else if (!row)
|
||||
logdev_end -= TOPBOT_IO_ROWS;
|
||||
}
|
||||
|
||||
if (xci->majors[major].flags & XC_MAJ_XM) {
|
||||
if (xci->majors[major].minors != 31) HERE();
|
||||
|
||||
// M devices
|
||||
if (logdev_start)
|
||||
printf_extrabits(bits, 21, 2, 0, logdev_start*64, row, major);
|
||||
for (i = logdev_start; i <= logdev_end; i++) {
|
||||
printf_lut_words(bits, row, major, 21, i*4);
|
||||
printf_lut_words(bits, row, major, 21, i*4+2);
|
||||
}
|
||||
if (logdev_end < 15)
|
||||
printf_extrabits(bits, 21, 2, i*64 + XC6_HCLK_BITS, (15-logdev_end)*64, row, major);
|
||||
printf_frames(&bits[23*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, 23, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
if (logdev_start)
|
||||
printf_extrabits(bits, 24, 2, 0, logdev_start*64, row, major);
|
||||
for (i = logdev_start; i <= logdev_end; i++) {
|
||||
printf_lut_words(bits, row, major, 24, i*4);
|
||||
printf_lut_words(bits, row, major, 24, i*4+2);
|
||||
}
|
||||
if (logdev_end < 15)
|
||||
printf_extrabits(bits, 24, 2, i*64 + XC6_HCLK_BITS, (15-logdev_end)*64, row, major);
|
||||
|
||||
// X devices
|
||||
printf_frames(&bits[26*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, 26, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
if (logdev_start)
|
||||
printf_extrabits(bits, 27, 4, 0, logdev_start*64, row, major);
|
||||
for (i = logdev_start; i <= logdev_end; i++) {
|
||||
printf_lut_words(bits, row, major, 27, i*4);
|
||||
printf_lut_words(bits, row, major, 29, i*4);
|
||||
printf_lut_words(bits, row, major, 27, i*4+2);
|
||||
printf_lut_words(bits, row, major, 29, i*4+2);
|
||||
}
|
||||
if (logdev_end < 15)
|
||||
printf_extrabits(bits, 27, 4, i*64 + XC6_HCLK_BITS, (15-logdev_end)*64, row, major);
|
||||
} else if (xci->majors[major].flags & (XC_MAJ_XL|XC_MAJ_CENTER)) {
|
||||
|
||||
// L devices
|
||||
if (logdev_start)
|
||||
printf_extrabits(bits, 21, 4, 0, logdev_start*64, row, major);
|
||||
for (i = logdev_start; i <= logdev_end; i++) {
|
||||
printf_lut_words(bits, row, major, 21, i*4);
|
||||
printf_lut_words(bits, row, major, 23, i*4);
|
||||
printf_lut_words(bits, row, major, 21, i*4+2);
|
||||
printf_lut_words(bits, row, major, 23, i*4+2);
|
||||
}
|
||||
if (logdev_end < 15)
|
||||
printf_extrabits(bits, 21, 4, i*64 + XC6_HCLK_BITS, (15-logdev_end)*64, row, major);
|
||||
printf_frames(&bits[25*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, 25, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
// X devices
|
||||
if (logdev_start)
|
||||
printf_extrabits(bits, 26, 4, 0, logdev_start*64, row, major);
|
||||
for (i = logdev_start; i <= logdev_end; i++) {
|
||||
printf_lut_words(bits, row, major, 26, i*4);
|
||||
printf_lut_words(bits, row, major, 28, i*4);
|
||||
printf_lut_words(bits, row, major, 26, i*4+2);
|
||||
printf_lut_words(bits, row, major, 28, i*4+2);
|
||||
}
|
||||
if (logdev_end < 15)
|
||||
printf_extrabits(bits, 26, 4, i*64 + XC6_HCLK_BITS, (15-logdev_end)*64, row, major);
|
||||
|
||||
// one extra minor in the center major
|
||||
if (xci->majors[major].flags & XC_MAJ_CENTER) {
|
||||
if (xci->majors[major].minors != 31) HERE();
|
||||
printf_frames(&bits[30*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, 30, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
} else { // XL
|
||||
if (xci->majors[major].minors != 30) HERE();
|
||||
}
|
||||
} else
|
||||
HERE();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
typedef struct ramb16_cfg
|
||||
{
|
||||
uint8_t byte[64];
|
||||
|
@ -714,252 +851,6 @@ static void print_ramb16_cfg(ramb16_cfg_t* cfg)
|
|||
printf("}\n");
|
||||
}
|
||||
|
||||
static void printf_routing_2minors(const uint8_t* bits, int row, int major,
|
||||
int even_minor)
|
||||
{
|
||||
int y, i, hclk;
|
||||
uint64_t u64_0, u64_1;
|
||||
char bit_str[129];
|
||||
|
||||
bit_str[128] = 0;
|
||||
for (y = 0; y < 16; y++) {
|
||||
hclk = (y < 8) ? 0 : 2;
|
||||
u64_0 = frame_get_u64(bits + y*8 + hclk);
|
||||
u64_1 = frame_get_u64(bits + y*8 + hclk + FRAME_SIZE);
|
||||
if (u64_0 || u64_1) {
|
||||
for (i = 0; i < 128; i++)
|
||||
bit_str[i] = '0';
|
||||
for (i = 0; i < 64; i++) {
|
||||
if (u64_0 & (1ULL << i))
|
||||
bit_str[i*2] = '1';
|
||||
if (u64_1 & (1ULL << i))
|
||||
bit_str[i*2+1] = '1';
|
||||
}
|
||||
// todo: might be nice to add the tile y and x here
|
||||
printf("r%i ma%i v64_%i mip%i %s\n",
|
||||
row, major, y, even_minor, bit_str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void printf_v64_mi20(const uint8_t* bits, int row, int major)
|
||||
{
|
||||
int y, i, num_bits_on, hclk;
|
||||
uint64_t u64;
|
||||
char bit_str[65];
|
||||
|
||||
bit_str[64] = 0;
|
||||
for (y = 0; y < 16; y++) {
|
||||
hclk = (y < 8) ? 0 : 2;
|
||||
u64 = frame_get_u64(bits + y*8 + hclk);
|
||||
if (u64) {
|
||||
for (i = 0; i < 64; i++)
|
||||
bit_str[i] = (u64 & (1ULL << i)) ? '1' : '0';
|
||||
printf("r%i ma%i v64_%i mi20 %s\n",
|
||||
row, major, y, bit_str);
|
||||
num_bits_on = 0;
|
||||
for (i = 0; i < 64; i++) {
|
||||
if (u64 & (1ULL << i))
|
||||
num_bits_on++;
|
||||
}
|
||||
// this is most helpful for bits 24:39 which are
|
||||
// part of logic device configuration
|
||||
if (num_bits_on < 5) {
|
||||
for (i = 0; i < 64; i++) {
|
||||
if (!(u64 & (1ULL << i)))
|
||||
continue;
|
||||
printf("r%i ma%i v64_%i mi20 b%i\n",
|
||||
row, major, y, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void printf_word(int word, int row, int major, int minor, int v16_i)
|
||||
{
|
||||
char bit_str[XC6_WORD_BITS];
|
||||
int i, num_bits_on;
|
||||
|
||||
num_bits_on = 0;
|
||||
for (i = 0; i < XC6_WORD_BITS; i++) {
|
||||
if (word & (1ULL << i))
|
||||
num_bits_on++;
|
||||
}
|
||||
if (num_bits_on >= 1 && num_bits_on <= 4) {
|
||||
printf("r%i ma%i v%i_%i mi%i", row,
|
||||
major, XC6_WORD_BITS, v16_i, minor);
|
||||
for (i = 0; i < XC6_WORD_BITS; i++) {
|
||||
if (word & (1ULL << i))
|
||||
printf(" b%i", i);
|
||||
}
|
||||
printf("\n");
|
||||
} else {
|
||||
for (i = 0; i < XC6_WORD_BITS; i++)
|
||||
bit_str[i] = (word & (1ULL << i)) ? '1' : '0';
|
||||
printf("r%i ma%i v%i_%i mi%i %.*s\n", row,
|
||||
major, XC6_WORD_BITS, v16_i, minor, XC6_WORD_BITS, bit_str);
|
||||
}
|
||||
}
|
||||
|
||||
static void printf_lut_words(const uint8_t *major_bits, int row, int major, int minor, int v16_i)
|
||||
{
|
||||
int off_in_frame, w;
|
||||
|
||||
off_in_frame = v16_i*XC6_WORD_BYTES;
|
||||
if (off_in_frame >= XC6_HCLK_POS)
|
||||
off_in_frame += XC6_HCLK_BYTES;
|
||||
|
||||
w = frame_get_pinword(&major_bits[minor*FRAME_SIZE + off_in_frame]);
|
||||
if (w) printf_word(w, row, major, minor, v16_i);
|
||||
|
||||
w = frame_get_pinword(&major_bits[minor*FRAME_SIZE + off_in_frame + XC6_WORD_BYTES]);
|
||||
if (w) printf_word(w, row, major, minor, v16_i+1);
|
||||
|
||||
w = frame_get_pinword(&major_bits[(minor+1)*FRAME_SIZE + off_in_frame]);
|
||||
if (w) printf_word(w, row, major, minor+1, v16_i);
|
||||
|
||||
w = frame_get_pinword(&major_bits[(minor+1)*FRAME_SIZE + off_in_frame + XC6_WORD_BYTES]);
|
||||
if (w) printf_word(w, row, major, minor+1, v16_i+1);
|
||||
}
|
||||
|
||||
static int dump_maj_zero(const uint8_t* bits, int row, int major)
|
||||
{
|
||||
int minor;
|
||||
|
||||
for (minor = 0; minor < get_major_minors(XC6SLX9, major); minor++)
|
||||
printf_clock(&bits[minor*FRAME_SIZE], row, major, minor);
|
||||
for (minor = 0; minor < get_major_minors(XC6SLX9, major); minor++)
|
||||
printf_frames(&bits[minor*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, minor, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dump_maj_left(const uint8_t* bits, int row, int major)
|
||||
{
|
||||
int minor;
|
||||
|
||||
for (minor = 0; minor < get_major_minors(XC6SLX9, major); minor++)
|
||||
printf_clock(&bits[minor*FRAME_SIZE], row, major, minor);
|
||||
for (minor = 0; minor < get_major_minors(XC6SLX9, major); minor++)
|
||||
printf_frames(&bits[minor*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, minor, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dump_maj_right(const uint8_t* bits, int row, int major)
|
||||
{
|
||||
int minor;
|
||||
|
||||
for (minor = 0; minor < get_major_minors(XC6SLX9, major); minor++)
|
||||
printf_clock(&bits[minor*FRAME_SIZE], row, major, minor);
|
||||
for (minor = 0; minor < get_major_minors(XC6SLX9, major); minor++)
|
||||
printf_frames(&bits[minor*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, minor, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dump_maj_logic(const uint8_t* bits, int row, int major)
|
||||
{
|
||||
const struct xc_die* xci = xc_die_info(XC6SLX9);
|
||||
int minor, i, logdev_start, logdev_end;
|
||||
|
||||
for (minor = 0; minor < xci->majors[major].minors; minor++)
|
||||
printf_clock(&bits[minor*FRAME_SIZE], row, major, minor);
|
||||
|
||||
// 0:19 routing minor pairs
|
||||
for (i = 0; i < 10; i++)
|
||||
printf_routing_2minors(&bits[i*2*FRAME_SIZE], row, major, i*2);
|
||||
|
||||
// mi20 as 64-char 0/1 string
|
||||
printf_v64_mi20(&bits[20*FRAME_SIZE], row, major);
|
||||
|
||||
logdev_start = 0;
|
||||
logdev_end = 15;
|
||||
if (xci->majors[major].flags & XC_MAJ_TOP_BOT_IO) {
|
||||
if (row == xc_die_info(XC6SLX9)->num_rows-1)
|
||||
logdev_start += TOPBOT_IO_ROWS;
|
||||
else if (!row)
|
||||
logdev_end -= TOPBOT_IO_ROWS;
|
||||
}
|
||||
|
||||
if (xci->majors[major].flags & XC_MAJ_XM) {
|
||||
if (xci->majors[major].minors != 31) HERE();
|
||||
|
||||
// M devices
|
||||
if (logdev_start)
|
||||
printf_extrabits(bits, 21, 2, 0, logdev_start*64, row, major);
|
||||
for (i = logdev_start; i <= logdev_end; i++) {
|
||||
printf_lut_words(bits, row, major, 21, i*4);
|
||||
printf_lut_words(bits, row, major, 21, i*4+2);
|
||||
}
|
||||
if (logdev_end < 15)
|
||||
printf_extrabits(bits, 21, 2, i*64 + XC6_HCLK_BITS, (15-logdev_end)*64, row, major);
|
||||
printf_frames(&bits[23*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, 23, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
if (logdev_start)
|
||||
printf_extrabits(bits, 24, 2, 0, logdev_start*64, row, major);
|
||||
for (i = logdev_start; i <= logdev_end; i++) {
|
||||
printf_lut_words(bits, row, major, 24, i*4);
|
||||
printf_lut_words(bits, row, major, 24, i*4+2);
|
||||
}
|
||||
if (logdev_end < 15)
|
||||
printf_extrabits(bits, 24, 2, i*64 + XC6_HCLK_BITS, (15-logdev_end)*64, row, major);
|
||||
|
||||
// X devices
|
||||
printf_frames(&bits[26*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, 26, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
if (logdev_start)
|
||||
printf_extrabits(bits, 27, 4, 0, logdev_start*64, row, major);
|
||||
for (i = logdev_start; i <= logdev_end; i++) {
|
||||
printf_lut_words(bits, row, major, 27, i*4);
|
||||
printf_lut_words(bits, row, major, 29, i*4);
|
||||
printf_lut_words(bits, row, major, 27, i*4+2);
|
||||
printf_lut_words(bits, row, major, 29, i*4+2);
|
||||
}
|
||||
if (logdev_end < 15)
|
||||
printf_extrabits(bits, 27, 4, i*64 + XC6_HCLK_BITS, (15-logdev_end)*64, row, major);
|
||||
} else if (xci->majors[major].flags & (XC_MAJ_XL|XC_MAJ_CENTER)) {
|
||||
|
||||
// L devices
|
||||
if (logdev_start)
|
||||
printf_extrabits(bits, 21, 4, 0, logdev_start*64, row, major);
|
||||
for (i = logdev_start; i <= logdev_end; i++) {
|
||||
printf_lut_words(bits, row, major, 21, i*4);
|
||||
printf_lut_words(bits, row, major, 23, i*4);
|
||||
printf_lut_words(bits, row, major, 21, i*4+2);
|
||||
printf_lut_words(bits, row, major, 23, i*4+2);
|
||||
}
|
||||
if (logdev_end < 15)
|
||||
printf_extrabits(bits, 21, 4, i*64 + XC6_HCLK_BITS, (15-logdev_end)*64, row, major);
|
||||
printf_frames(&bits[25*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, 25, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
// X devices
|
||||
if (logdev_start)
|
||||
printf_extrabits(bits, 26, 4, 0, logdev_start*64, row, major);
|
||||
for (i = logdev_start; i <= logdev_end; i++) {
|
||||
printf_lut_words(bits, row, major, 26, i*4);
|
||||
printf_lut_words(bits, row, major, 28, i*4);
|
||||
printf_lut_words(bits, row, major, 26, i*4+2);
|
||||
printf_lut_words(bits, row, major, 28, i*4+2);
|
||||
}
|
||||
if (logdev_end < 15)
|
||||
printf_extrabits(bits, 26, 4, i*64 + XC6_HCLK_BITS, (15-logdev_end)*64, row, major);
|
||||
|
||||
// one extra minor in the center major
|
||||
if (xci->majors[major].flags & XC_MAJ_CENTER) {
|
||||
if (xci->majors[major].minors != 31) HERE();
|
||||
printf_frames(&bits[30*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, 30, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
} else { // XL
|
||||
if (xci->majors[major].minors != 30) HERE();
|
||||
}
|
||||
} else
|
||||
HERE();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dump_maj_bram(const uint8_t* bits, int row, int major)
|
||||
{
|
||||
ramb16_cfg_t ramb16_cfg[4];
|
||||
|
@ -975,6 +866,14 @@ static int dump_maj_bram(const uint8_t* bits, int row, int major)
|
|||
// mi20 as 64-char 0/1 string
|
||||
printf_v64_mi20(&bits[20*FRAME_SIZE], row, major);
|
||||
|
||||
// todo: minors 21-24
|
||||
// r%i ma%i v16_%i mi%i pins 0000000000000000 0xFFFF
|
||||
// r%i ma%i v16_%i mi%i pin 12
|
||||
// r%i ma%i v16_%i mi%i bits 0000000000000000 0xFFFF
|
||||
// r%i ma%i v16_%i mi%i bit 12
|
||||
// v16_clk
|
||||
|
||||
#if 0
|
||||
printf_frames(&bits[21*FRAME_SIZE], /*max_frames*/ 1,
|
||||
row, major, 21, /*print_empty*/ 0, /*no_clock*/ 1);
|
||||
printf_frames(&bits[22*FRAME_SIZE], /*max_frames*/ 1,
|
||||
|
@ -1001,6 +900,7 @@ static int dump_maj_bram(const uint8_t* bits, int row, int major)
|
|||
row, major, i);
|
||||
print_ramb16_cfg(&ramb16_cfg[i]);
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
149
libs/helper.c
149
libs/helper.c
|
@ -90,10 +90,6 @@ void atom_remove(char *bits, const cfg_atom_t *atom)
|
|||
}
|
||||
}
|
||||
|
||||
// for an equivalent schematic, see lut.svg
|
||||
const int lut_base_vars[6] = {0 /* A1 */, 1, 0 /* A3 - not used */,
|
||||
0, 0, 1 /* A6 */};
|
||||
|
||||
static int bool_nextlen(const char *expr, int len)
|
||||
{
|
||||
int i, depth;
|
||||
|
@ -558,25 +554,30 @@ void frame_set_pinword(void* bits, int v)
|
|||
((uint8_t*)bits)[1] = v & 0xFF;
|
||||
}
|
||||
|
||||
uint8_t frame_get_u8(const uint8_t *frame_d)
|
||||
uint8_t mirror_bits(uint8_t v)
|
||||
{
|
||||
uint8_t v = 0;
|
||||
uint8_t mv = 0;
|
||||
int i;
|
||||
for (i = 0; i < 8; i++)
|
||||
if (*frame_d & (1<<i)) v |= 1 << (7-i);
|
||||
return v;
|
||||
if (v & (1<<i)) mv |= 1 << (7-i);
|
||||
return mv;
|
||||
}
|
||||
|
||||
int pinword_to_cpu(int pinword)
|
||||
{
|
||||
return mirror_bits(((pinword & 0xFF00) >> 8)) << 8 | mirror_bits(pinword & 0xFF);
|
||||
}
|
||||
|
||||
// see ug380, table 2-5, bit ordering
|
||||
uint16_t frame_get_u16(const uint8_t *frame_d)
|
||||
{
|
||||
uint16_t high_b, low_b;
|
||||
high_b = frame_get_u8(frame_d);
|
||||
low_b = frame_get_u8(frame_d+1);
|
||||
high_b = mirror_bits(frame_d[0]);
|
||||
low_b = mirror_bits(frame_d[1]);
|
||||
return (high_b << 8) | low_b;
|
||||
}
|
||||
|
||||
uint32_t frame_get_u32(const uint8_t *frame_d)
|
||||
static uint32_t frame_get_u32(const uint8_t *frame_d)
|
||||
{
|
||||
uint32_t high_w, low_w;
|
||||
low_w = frame_get_u16(frame_d);
|
||||
|
@ -592,27 +593,16 @@ uint64_t frame_get_u64(const uint8_t *frame_d)
|
|||
return (high_w << 32) | low_w;
|
||||
}
|
||||
|
||||
void frame_set_u8(uint8_t *frame_d, uint8_t v)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (v & (1<<(7-i)))
|
||||
(*frame_d) |= 1<<i;
|
||||
else
|
||||
(*frame_d) &= ~(1<<i);
|
||||
}
|
||||
}
|
||||
|
||||
void frame_set_u16(uint8_t *frame_d, uint16_t v)
|
||||
{
|
||||
uint16_t high_b, low_b;
|
||||
high_b = v >> 8;
|
||||
low_b = v & 0xFF;
|
||||
frame_set_u8(frame_d, high_b);
|
||||
frame_set_u8(frame_d+1, low_b);
|
||||
frame_d[0] = mirror_bits(high_b);
|
||||
frame_d[1] = mirror_bits(low_b);
|
||||
}
|
||||
|
||||
void frame_set_u32(uint8_t* frame_d, uint32_t v)
|
||||
static void frame_set_u32(uint8_t* frame_d, uint32_t v)
|
||||
{
|
||||
uint32_t high_w, low_w;
|
||||
high_w = v >> 16;
|
||||
|
@ -788,6 +778,115 @@ void write_lut64(uint8_t* two_minors, int off_in_frame, uint64_t u64)
|
|||
}
|
||||
}
|
||||
|
||||
void printf_routing_2minors(const uint8_t* bits, int row, int major,
|
||||
int even_minor)
|
||||
{
|
||||
int y, i, hclk;
|
||||
uint64_t u64_0, u64_1;
|
||||
char bit_str[129];
|
||||
|
||||
bit_str[128] = 0;
|
||||
for (y = 0; y < 16; y++) {
|
||||
hclk = (y < 8) ? 0 : 2;
|
||||
u64_0 = frame_get_u64(bits + y*8 + hclk);
|
||||
u64_1 = frame_get_u64(bits + y*8 + hclk + FRAME_SIZE);
|
||||
if (u64_0 || u64_1) {
|
||||
for (i = 0; i < 128; i++)
|
||||
bit_str[i] = '0';
|
||||
for (i = 0; i < 64; i++) {
|
||||
if (u64_0 & (1ULL << i))
|
||||
bit_str[i*2] = '1';
|
||||
if (u64_1 & (1ULL << i))
|
||||
bit_str[i*2+1] = '1';
|
||||
}
|
||||
// todo: might be nice to add the tile y and x here
|
||||
printf("r%i ma%i v64_%i mip%i %s\n",
|
||||
row, major, y, even_minor, bit_str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void printf_v64_mi20(const uint8_t* bits, int row, int major)
|
||||
{
|
||||
int y, i, num_bits_on, hclk;
|
||||
uint64_t u64;
|
||||
char bit_str[65];
|
||||
|
||||
bit_str[64] = 0;
|
||||
for (y = 0; y < 16; y++) {
|
||||
hclk = (y < 8) ? 0 : 2;
|
||||
u64 = frame_get_u64(bits + y*8 + hclk);
|
||||
if (u64) {
|
||||
for (i = 0; i < 64; i++)
|
||||
bit_str[i] = (u64 & (1ULL << i)) ? '1' : '0';
|
||||
printf("r%i ma%i v64_%i mi20 %s\n",
|
||||
row, major, y, bit_str);
|
||||
num_bits_on = 0;
|
||||
for (i = 0; i < 64; i++) {
|
||||
if (u64 & (1ULL << i))
|
||||
num_bits_on++;
|
||||
}
|
||||
// this is most helpful for bits 24:39 which are
|
||||
// part of logic device configuration
|
||||
if (num_bits_on < 5) {
|
||||
for (i = 0; i < 64; i++) {
|
||||
if (!(u64 & (1ULL << i)))
|
||||
continue;
|
||||
printf("r%i ma%i v64_%i mi20 b%i\n",
|
||||
row, major, y, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void printf_word(int word, int row, int major, int minor, int v16_i)
|
||||
{
|
||||
char bit_str[XC6_WORD_BITS];
|
||||
int i, num_bits_on;
|
||||
|
||||
num_bits_on = 0;
|
||||
for (i = 0; i < XC6_WORD_BITS; i++) {
|
||||
if (word & (1ULL << i))
|
||||
num_bits_on++;
|
||||
}
|
||||
if (num_bits_on >= 1 && num_bits_on <= 4) {
|
||||
printf("r%i ma%i v%i_%i mi%i", row,
|
||||
major, XC6_WORD_BITS, v16_i, minor);
|
||||
for (i = 0; i < XC6_WORD_BITS; i++) {
|
||||
if (word & (1ULL << i))
|
||||
printf(" b%i", i);
|
||||
}
|
||||
printf("\n");
|
||||
} else {
|
||||
for (i = 0; i < XC6_WORD_BITS; i++)
|
||||
bit_str[i] = (word & (1ULL << i)) ? '1' : '0';
|
||||
printf("r%i ma%i v%i_%i mi%i %.*s\n", row,
|
||||
major, XC6_WORD_BITS, v16_i, minor, XC6_WORD_BITS, bit_str);
|
||||
}
|
||||
}
|
||||
|
||||
void printf_lut_words(const uint8_t *major_bits, int row, int major, int minor, int v16_i)
|
||||
{
|
||||
int off_in_frame, w;
|
||||
|
||||
off_in_frame = v16_i*XC6_WORD_BYTES;
|
||||
if (off_in_frame >= XC6_HCLK_POS)
|
||||
off_in_frame += XC6_HCLK_BYTES;
|
||||
|
||||
w = frame_get_pinword(&major_bits[minor*FRAME_SIZE + off_in_frame]);
|
||||
if (w) printf_word(w, row, major, minor, v16_i);
|
||||
|
||||
w = frame_get_pinword(&major_bits[minor*FRAME_SIZE + off_in_frame + XC6_WORD_BYTES]);
|
||||
if (w) printf_word(w, row, major, minor, v16_i+1);
|
||||
|
||||
w = frame_get_pinword(&major_bits[(minor+1)*FRAME_SIZE + off_in_frame]);
|
||||
if (w) printf_word(w, row, major, minor+1, v16_i);
|
||||
|
||||
w = frame_get_pinword(&major_bits[(minor+1)*FRAME_SIZE + off_in_frame + XC6_WORD_BYTES]);
|
||||
if (w) printf_word(w, row, major, minor+1, v16_i+1);
|
||||
}
|
||||
|
||||
int get_vm_mb(void)
|
||||
{
|
||||
FILE* statusf = fopen("/proc/self/status", "r");
|
||||
|
|
|
@ -87,14 +87,12 @@ void frame_set_bit(uint8_t* frame_d, int bit);
|
|||
int frame_get_pinword(const void *bits);
|
||||
void frame_set_pinword(void* bits, int v);
|
||||
|
||||
uint8_t frame_get_u8(const uint8_t* frame_d);
|
||||
uint16_t frame_get_u16(const uint8_t* frame_d);
|
||||
uint32_t frame_get_u32(const uint8_t* frame_d);
|
||||
uint64_t frame_get_u64(const uint8_t* frame_d);
|
||||
uint8_t mirror_bits(uint8_t v);
|
||||
int pinword_to_cpu(int pinword);
|
||||
|
||||
void frame_set_u8(uint8_t* frame_d, uint8_t v);
|
||||
uint16_t frame_get_u16(const uint8_t* frame_d);
|
||||
uint64_t frame_get_u64(const uint8_t* frame_d);
|
||||
void frame_set_u16(uint8_t* frame_d, uint16_t v);
|
||||
void frame_set_u32(uint8_t* frame_d, uint32_t v);
|
||||
void frame_set_u64(uint8_t* frame_d, uint64_t v);
|
||||
|
||||
uint64_t frame_get_lut64(int lut_pos, const uint8_t *two_minors, int v16);
|
||||
|
@ -112,6 +110,12 @@ int clb_empty(uint8_t* maj_bits, int idx);
|
|||
void printf_extrabits(const uint8_t* maj_bits, int start_minor, int num_minors,
|
||||
int start_bit, int num_bits, int row, int major);
|
||||
void write_lut64(uint8_t* two_minors, int off_in_frame, uint64_t u64);
|
||||
void printf_routing_2minors(const uint8_t* bits, int row, int major,
|
||||
int even_minor);
|
||||
void printf_v64_mi20(const uint8_t* bits, int row, int major);
|
||||
void printf_word(int word, int row, int major, int minor, int v16_i);
|
||||
void printf_lut_words(const uint8_t *major_bits, int row, int major,
|
||||
int minor, int v16_i);
|
||||
|
||||
int get_vm_mb(void);
|
||||
int get_random(void);
|
||||
|
|
Loading…
Reference in New Issue
Block a user