fixed minor bug wrt required inpins

This commit is contained in:
Wolfgang Spraul 2013-02-15 05:33:34 -05:00
parent 740903a09c
commit 0a320d67f6
5 changed files with 49 additions and 32 deletions

1
README
View File

@ -63,7 +63,6 @@ Design Principles
TODO (as of February, 2013)
short-term (1 month):
* finish lut_encoding test
* finish dist_mem test
* support block memory
* example: counter (including clock, jtag)

View File

@ -838,8 +838,7 @@ int fdev_set_required_pins(struct fpga_model* model, int y, int x, int type,
int type_idx)
{
struct fpga_device* dev;
int req_inpins[6];
int i, j, k, rc;
int req_inpins, i, j, rc;
RC_CHECK(model);
dev = fdev_p(model, y, x, type, type_idx);
@ -897,32 +896,18 @@ int fdev_set_required_pins(struct fpga_model* model, int y, int x, int type,
add_req_inpin(dev, LI_AX+i);
}
for (j = 0; j < 6; j++)
req_inpins[j] = 0;
req_inpins = 0;
if (dev->u.logic.a2d[i].flags & LUT5VAL_SET) {
// A6 must be high/vcc if lut5 is used
req_inpins[5] = 1;
for (j = 0; j < 32; j++) {
if (!(dev->u.logic.a2d[i].lut5_val & (1ULL << j)))
continue;
for (k = 0; k < 5; k++) {
if (j & (1<<k))
req_inpins[k] = 1;
}
}
req_inpins |= 1<<5;
req_inpins |= bool_req_pins(dev->u.logic.a2d[i].lut5_val, 32);
}
if (dev->u.logic.a2d[i].flags & LUT6VAL_SET) {
for (j = 0; j < 64; j++) {
if (!(dev->u.logic.a2d[i].lut6_val & (1ULL << j)))
continue;
for (k = 0; k < 6; k++) {
if (j & (1<<k))
req_inpins[k] = 1;
}
}
req_inpins |= bool_req_pins(dev->u.logic.a2d[i].lut6_val,
(dev->u.logic.a2d[i].flags & LUT5VAL_SET) ? 32 : 64);
}
for (j = 0; j < 6; j++) {
if (req_inpins[j])
if (req_inpins & (1<<j))
add_req_inpin(dev, LI_A1+i*6+j);
}
if ((dev->u.logic.a2d[i].ff_mux == MUX_XOR

View File

@ -122,6 +122,8 @@ static int bool_nextlen(const char *expr, int len)
if (expr[i] < '1' || expr[i] > '6') return -1;
return i+1;
}
if (expr[i] == '0' || expr[i] == '1')
return i+1;
return -1;
}
@ -236,7 +238,11 @@ int bool_str2bits(const char *str, int str_len, uint64_t *u64, int num_bits)
for (j = 0; j < sizeof(vars)/sizeof(*vars); j++)
vars[j] = (i & (1<<j)) != 0;
bool_res = bool_eval(str, str_len, vars);
if (bool_res == -1) FAIL(EINVAL);
if (bool_res == -1) {
fprintf(stderr, "#E %s:%i cannot evaluate '%.*s'\n",
__FILE__, __LINE__, str_len, str);
FAIL(EINVAL);
}
if (bool_res) *u64 |= 1ULL<<i;
}
return 0;
@ -265,17 +271,13 @@ const char* bool_bits2str(uint64_t u64, int num_bits)
int str_end, first_op, bit_width;
static char str[2048];
if (!u64) return "0";
if (num_bits == 64) {
if (!u64) return "0";
if (u64 == 0xFFFFFFFFFFFFFFFFULL) return "1";
bit_width = 6;
} else if (num_bits == 32) {
if (u64 & 0xFFFFFFFF00000000ULL) {
// upper 32 bits should be 0
HERE();
return "0";
}
if (u64 == 0x00000000FFFFFFFFULL) return "1";
if (!ULL_LOW32(u64)) return "0";
if (ULL_LOW32(u64) == 0xFFFFFFFF) return "1";
bit_width = 5;
} else {
HERE();
@ -370,6 +372,37 @@ const char* bool_bits2str(uint64_t u64, int num_bits)
return str;
}
int bool_req_pins(uint64_t u64, int num_bits)
{
static const uint64_t pin_mask[6] = {
0xAAAAAAAAAAAAAAAA, /*A1*/
0xCCCCCCCCCCCCCCCC, /*A2*/
0xF0F0F0F0F0F0F0F0, /*A3*/
0xFF00FF00FF00FF00, /*A4*/
0xFFFF0000FFFF0000, /*A5*/
0xFFFFFFFF00000000 /*A6*/ };
uint64_t bit_mask;
int req_pins, num_pins, i;
if (num_bits == 32) {
num_pins = 5;
bit_mask = 0x00000000FFFFFFFF;
} else {
if (num_bits != 64) HERE();
num_pins = 6;
bit_mask = 0xFFFFFFFFFFFFFFFF;
}
// Special cases of all bits 0 and all bits 1 will
// correctly lead to req_pins == 0 because all bits
// are the same.
req_pins = 0;
for (i = 0; i < num_pins; i++) {
if ((u64 & pin_mask[i] & bit_mask) >> (1<<i) != (u64 & ~pin_mask[i] & bit_mask))
req_pins |= 1<<i;
}
return req_pins;
}
void printf_type2(uint8_t *d, int len, int inpos, int num_entries)
{
uint64_t u64;

View File

@ -72,6 +72,7 @@ int bool_str2u32(const char *str, uint32_t *u32);
int bool_str2lut_pair(const char *str6, const char *str5, uint64_t *lut6_val, uint32_t *lut5_val);
int bool_str2bits(const char* str, int str_len, uint64_t* u64, int num_bits);
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);

View File

@ -416,7 +416,6 @@ enum {
"COUT" }
enum { LUT_A = 0, LUT_B, LUT_C, LUT_D }; // offset into a2d[]
enum { LUTMODE_LUT = 1, LUTMODE_ROM, LUTMODE_RAM };
#define OUT_USED 0x0001
#define LUT5VAL_SET 0x0002
#define LUT6VAL_SET 0x0004