diff --git a/src/xspice/idn/idndig.c b/src/xspice/idn/idndig.c index 15e3877e5..25870229b 100644 --- a/src/xspice/idn/idndig.c +++ b/src/xspice/idn/idndig.c @@ -123,40 +123,53 @@ static void idn_digital_resolve(int num_struct, Digital_t **dig_struct_array; Digital_t *dig_struct; - static int map[12][12] = { - { 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2}, - { 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1}, - { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, - { 0, 1, 2, 3, 5, 5, 3, 3, 3, 9, 11, 11}, - { 0, 1, 2, 5, 4, 5, 4, 4, 4, 11, 10, 11}, - { 0, 1, 2, 5, 5, 5, 5, 5, 5, 10, 11, 11}, - { 0, 1, 2, 3, 4, 5, 6, 8, 8, 9, 11, 11}, - { 0, 1, 2, 3, 4, 5, 8, 7, 8, 11, 10, 11}, - { 0, 1, 2, 3, 4, 5, 8, 8, 8, 11, 11, 11}, - { 0, 2, 2, 9, 11, 11, 9, 11, 11, 9, 11, 11}, - { 2, 1, 2, 11, 10, 11, 11, 10, 11, 11, 10, 11}, - { 2, 1, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11} }; +#define e(v, s) (((s) * 3) + (v)) +#define L ZERO +#define H ONE +#define U UNKNOWN +#define s STRONG +#define r RESISTIVE +#define z HI_IMPEDANCE +#define u UNDETERMINED + static const int map[12][12] = { +// ------------ e(L,s), e(H,s), e(U,s), e(L,r), e(H,r), e(U,r), e(L,z), e(H,z), e(U,z), e(L,u), e(H,u), e(U,u) ----------- + +/* e(L,s) */ { e(L,s), e(U,s), e(U,s), e(L,s), e(L,s), e(L,s), e(L,s), e(L,s), e(L,s), e(L,s), e(U,s), e(U,s)}, // e(L,s) +/* e(H,s) */ { e(U,s), e(H,s), e(U,s), e(H,s), e(H,s), e(H,s), e(H,s), e(H,s), e(H,s), e(U,s), e(H,s), e(U,s)}, // e(H,s) +/* e(U,s) */ { e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s), e(U,s)}, // e(U,s) +/* e(L,r) */ { e(L,s), e(H,s), e(U,s), e(L,r), e(U,r), e(U,r), e(L,r), e(L,r), e(L,r), e(L,u), e(U,u), e(U,u)}, // e(L,r) +/* e(H,r) */ { e(L,s), e(H,s), e(U,s), e(U,r), e(H,r), e(U,r), e(H,r), e(H,r), e(H,r), e(U,u), e(H,u), e(U,u)}, // e(H,r) +/* e(U,r) */ { e(L,s), e(H,s), e(U,s), e(U,r), e(U,r), e(U,r), e(U,r), e(U,r), e(U,r), e(U,u), e(U,u), e(U,u)}, // e(H,r) +/* e(L,z) */ { e(L,s), e(H,s), e(U,s), e(L,r), e(H,r), e(U,r), e(L,z), e(U,z), e(U,z), e(L,u), e(U,u), e(U,u)}, // e(L,z) +/* e(H,z) */ { e(L,s), e(H,s), e(U,s), e(L,r), e(H,r), e(U,r), e(U,z), e(H,z), e(U,z), e(U,u), e(H,u), e(U,u)}, // e(H,z) +/* e(U,z) */ { e(L,s), e(H,s), e(U,s), e(L,r), e(H,r), e(U,r), e(U,z), e(U,z), e(U,z), e(U,u), e(U,u), e(U,u)}, // e(U,z) +/* e(L,u) */ { e(L,s), e(U,s), e(U,s), e(L,u), e(U,u), e(U,u), e(L,u), e(U,u), e(U,u), e(L,u), e(U,u), e(U,u)}, // e(L,u) +/* e(H,u) */ { e(U,s), e(H,s), e(U,s), e(U,u), e(H,u), e(U,u), e(U,u), e(H,u), e(U,u), e(U,u), e(H,u), e(U,u)}, // e(H,u) +/* e(U,u) */ { e(U,s), e(U,s), e(U,s), e(U,u), e(U,u), e(U,u), e(U,u), e(U,u), e(U,u), e(U,u), e(U,u), e(U,u)}}; // e(U,u) + +// ----------- e(L,s), e(H,s), e(U,s), e(L,r), e(H,r), e(U,r), e(L,z), e(H,z), e(U,z), e(L,u), e(H,u), e(U,u) ------------ int i; - int index1; int index2; /* Cast the input void pointers to pointers of the digital type */ dig_struct = (Digital_t *) evt_struct; - dig_struct_array = (Digital_t **)evt_struct_array; + dig_struct_array = (Digital_t **)evt_struct_array; - /* Copy the first member of the array directly to the output */ - dig_struct->state = dig_struct_array[0]->state; - dig_struct->strength = dig_struct_array[0]->strength; + if (num_struct < 2) { + /* Copy the first member of the array directly to the output */ + dig_struct->state = dig_struct_array[0]->state; + dig_struct->strength = dig_struct_array[0]->strength; + return; + } /* Convert struct to index into map */ - index1 = (int) (dig_struct->state + dig_struct->strength * 3); - + index1 = (int)(dig_struct_array[0]->state + + dig_struct_array[0]->strength * 3); /* For the remaining members, perform the resolution algorithm */ for(i = 1; i < num_struct; i++) { - /* Convert struct to index into map */ index2 = (int)(dig_struct_array[i]->state + dig_struct_array[i]->strength * 3);