Handle nets driven by C8<> constants.

This commit is contained in:
Stephen Williams 2009-08-29 08:53:44 -07:00
parent aad5029ff3
commit a2bf4904c4
5 changed files with 49 additions and 35 deletions

View File

@ -786,7 +786,6 @@ double crstring_to_double(const char*label)
void input_connect(vvp_net_t*fdx, unsigned port, char*label)
{
vvp_net_ptr_t ifdx = vvp_net_ptr_t(fdx, port);
char*tp;
/* Is this a vvp_vector4_t constant value? */
if (c4string_test(label)) {
@ -807,40 +806,9 @@ void input_connect(vvp_net_t*fdx, unsigned port, char*label)
}
/* Is this a vvp_vector8_t constant value? */
if ((strncmp(label, "C8<", 3) == 0)
&& ((tp = strchr(label,'>')))
&& (tp[1] == 0)
&& (strspn(label+3, "01234567xz")+3 == (unsigned)(tp-label))) {
size_t vsize = tp-label-3;
assert(vsize%3 == 0);
vsize /= 3;
vvp_vector8_t tmp (vsize);
for (unsigned idx = 0 ; idx < vsize ; idx += 1) {
vvp_bit4_t bit = BIT4_Z;
unsigned dr0 = label[3+idx*3+0] - '0';
unsigned dr1 = label[3+idx*3+1] - '0';
switch (label[3+idx*3+2]) {
case '0':
bit = BIT4_0;
break;
case '1':
bit = BIT4_1;
break;
case 'x':
bit = BIT4_X;
break;
case 'z':
bit = BIT4_Z;
break;
}
tmp.set_bit(vsize-idx-1, vvp_scalar_t(bit, dr0, dr1));
}
if (c8string_test(label)) {
vvp_vector8_t tmp = c8string_to_vector8(label);
schedule_set_vector(ifdx, tmp);
free(label);

View File

@ -676,6 +676,15 @@ void schedule_init_vector(vvp_net_ptr_t ptr, vvp_vector4_t bit)
schedule_init_list = cur;
}
void schedule_init_vector(vvp_net_ptr_t ptr, vvp_vector8_t bit)
{
struct assign_vector8_event_s*cur = new struct assign_vector8_event_s;
cur->ptr = ptr;
cur->val = bit;
cur->next = schedule_init_list;
schedule_init_list = cur;
}
void schedule_init_vector(vvp_net_ptr_t ptr, double bit)
{
struct assign_real_event_s*cur = new struct assign_real_event_s;

View File

@ -87,6 +87,7 @@ extern void schedule_set_vector(vvp_net_ptr_t ptr, double val);
* (propagated as events) through the rest of the net.
*/
extern void schedule_init_vector(vvp_net_ptr_t ptr, vvp_vector4_t val);
extern void schedule_init_vector(vvp_net_ptr_t ptr, vvp_vector8_t val);
extern void schedule_init_vector(vvp_net_ptr_t ptr, double val);
/*

View File

@ -2549,6 +2549,42 @@ bool c8string_test(const char*str)
}
return false;
}
/*
* The format of a C8<> string is:
* C8<aaabbbccc...>
* where aaa... is a 3 character bit descriptor.
*/
vvp_vector8_t c8string_to_vector8(const char*str)
{
size_t vsize = strlen(str)-4;
assert(vsize%3 == 0);
vsize /= 3;
vvp_vector8_t tmp (vsize);
for (size_t idx = 0 ; idx < vsize ; idx += 1) {
const char*cp = str+3+3*idx;
vvp_bit4_t bit = BIT4_X;
unsigned dr0 = cp[0]-'0';
unsigned dr1 = cp[1]-'0';
switch (cp[2]) {
case '0':
bit = BIT4_0;
break;
case '1':
bit = BIT4_1;
break;
case 'x':
bit = BIT4_X;
break;
case 'z':
bit = BIT4_Z;
break;
}
tmp.set_bit(vsize-idx-1, vvp_scalar_t(bit, dr0, dr1));
}
return tmp;
}
ostream& operator<<(ostream&out, const vvp_vector8_t&that)
{

View File

@ -160,7 +160,7 @@ vvp_net_t* create_constant_node(const char*label, const char*val_str)
if (c8string_test(val_str)) {
vvp_net_t*net = new vvp_net_t;
net->fun = new vvp_fun_bufz;
assert(0); // XXXX Don't know how to init a vvp_vector8_t? */
schedule_init_vector(vvp_net_ptr_t(net,0), c8string_to_vector8(val_str));
return net;
}