fixed minor bug wrt required inpins
This commit is contained in:
parent
740903a09c
commit
0a320d67f6
1
README
1
README
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user