static void* lxt2_thread(void*arg) { /* Keep track of the current time, and only call the set_time function when the time changes. */ uint64_t cur_time = 0; int run_flag = 1; (void)arg; /* Parameter is not used. */ while (run_flag) { struct vcd_work_item_s*cell = vcd_work_thread_peek(); if (cell->time != cur_time) { cur_time = cell->time; lxt2_wr_set_time64(dump_file, cur_time); } switch (cell->type) { case WT_NONE: break; case WT_FLUSH: lxt2_wr_flush(dump_file); break; case WT_DUMPON: lxt2_wr_set_dumpon(dump_file); break; case WT_DUMPOFF: lxt2_wr_set_dumpoff(dump_file); break; case WT_EMIT_DOUBLE: lxt2_wr_emit_value_double(dump_file, cell->sym_.lxt2, 0, cell->op_.val_double); break; case WT_EMIT_BITS: lxt2_wr_emit_value_bit_string(dump_file, cell->sym_.lxt2, 0, cell->op_.val_char); break; case WT_TERMINATE: run_flag = 0; break; } vcd_work_thread_pop(); } return 0; }
/************************************************* lxt2_dump - dump symbol value ************************************************/ static void lxt2_dump( info_p info, int init ) { if( info->real ) { s_acc_value value; value.format = accRealVal; acc_fetch_value( info->object, "%%", &value ); lxt2_wr_emit_value_double( lxt.t, info->symbol, 0, value.value.real ); } else if( info->event ) { if( init ) { lxt2_wr_emit_value_bit_string( lxt.t, info->symbol, 0, "0" ); } else { lxt2_wr_emit_value_bit_string( lxt.t, info->symbol, 0, "1" ); info->updateNext = lxt.eventList; lxt.eventList = info; } } else { lxt2_wr_emit_value_bit_string( lxt.t, info->symbol, 0, acc_fetch_value( info->object, "%b", null ) ); #if DEBUG io_printf( "lxt2_dump: %s %s\n", info->name, acc_fetch_value( info->object, "%b", null ) ); #endif } }
static void parse_valuechange(void) { struct vcdsymbol *v; char *vector; int vlen; switch(yytext[0]) { case '0': case '1': case 'x': case 'X': case 'z': case 'Z': case 'h': case 'H': case 'u': case 'U': case 'w': case 'W': case 'l': case 'L': case '-': if(yylen>1) { v=bsearch_vcd(yytext+1, yylen-1); if(!v) { fprintf(stderr,"Near line %d, Unknown VCD identifier: '%s'\n",vcdlineno,yytext+1); } else { if(v->vartype!=V_EVENT) { char vl[2]; vl[0]=yytext[0]; vl[1]=0; lxt2_wr_emit_value_bit_string(lt, v->ltsym, 0, vl); v->value[0]=yytext[0]; DEBUG(fprintf(stderr,"%s = '%c'\n",v->name,v->value[0])); add_histent(current_time,v->narray[0],v->value[0],1, NULL); } else { char vl[2]; v->value[0]=(dumping_off)?'x':'1'; /* only '1' is relevant */ if(current_time!=(v->ev->last_event_time+1)) { /* dump degating event */ DEBUG(fprintf(stderr,"#"TTFormat" %s = '%c' (event)\n",v->ev->last_event_time+1,v->name,'0')); add_histent(v->ev->last_event_time+1,v->narray[0],'0',1, NULL); } DEBUG(fprintf(stderr,"%s = '%c' (event)\n",v->name,v->value[0])); add_histent(current_time,v->narray[0],v->value[0],1, NULL); vl[0]='1'; vl[1]=0; lxt2_wr_emit_value_bit_string(lt, v->ltsym, 0, vl); vl[0]='0'; vl[1]=0; lxt2_wr_emit_value_bit_string(lt, v->ltsym, 0, vl); v->ev->last_event_time=current_time; } } } else { fprintf(stderr,"Near line %d, Malformed VCD identifier\n", vcdlineno); } break; case 'b': case 'B': /* extract binary number then.. */ vector=malloc_2(yylen_cache=yylen); strcpy(vector,yytext+1); vlen=yylen-1; get_strtoken(); v=bsearch_vcd(yytext, yylen); if(!v) { fprintf(stderr,"Near line %d, Unknown identifier: '%s'\n",vcdlineno, yytext); free_2(vector); } else { if(vlen<v->size) /* fill in left part */ { char extend; int i, fill; extend=(vector[0]=='1')?'0':vector[0]; fill=v->size-vlen; for(i=0;i<fill;i++) { v->value[i]=extend; } strcpy(v->value+fill,vector); } else if(vlen==v->size) /* straight copy */ { strcpy(v->value,vector); } else /* too big, so copy only right half */ { int skip; skip=vlen-v->size; strcpy(v->value,vector+skip); } DEBUG(fprintf(stderr,"%s = '%s'\n",v->name, v->value)); lxt2_wr_emit_value_bit_string(lt, v->ltsym, 0, v->value); if((v->size==1)||(!atomic_vectors)) { int i; for(i=0;i<v->size;i++) { add_histent(current_time, v->narray[i],v->value[i],1, NULL); } free_2(vector); } else { if(yylen_cache!=(v->size+1)) { free_2(vector); vector=malloc_2(v->size+1); } strcpy(vector,v->value); add_histent(current_time, v->narray[0],0,1,vector); free_2(vector); } } break; case 'p': /* extract port dump value.. */ vector=malloc_2(yylen_cache=yylen); strcpy(vector,yytext+1); vlen=yylen-1; get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* this is the id */ v=bsearch_vcd(yytext, yylen); if(!v) { fprintf(stderr,"Near line %d, Unknown identifier: '%s'\n",vcdlineno, yytext); free_2(vector); } else { if(vlen<v->size) /* fill in left part */ { char extend; int i, fill; extend='0'; fill=v->size-vlen; for(i=0;i<fill;i++) { v->value[i]=extend; } evcd_strcpy(v->value+fill,vector); } else if(vlen==v->size) /* straight copy */ { evcd_strcpy(v->value,vector); } else /* too big, so copy only right half */ { int skip; skip=vlen-v->size; evcd_strcpy(v->value,vector+skip); } DEBUG(fprintf(stderr,"%s = '%s'\n",v->name, v->value)); lxt2_wr_emit_value_bit_string(lt, v->ltsym, 0, v->value); if((v->size==1)||(!atomic_vectors)) { int i; for(i=0;i<v->size;i++) { add_histent(current_time, v->narray[i],v->value[i],1, NULL); } free_2(vector); } else { if(yylen_cache<v->size) { free_2(vector); vector=malloc_2(v->size+1); } strcpy(vector,v->value); add_histent(current_time, v->narray[0],0,1,vector); free_2(vector); } } break; case 'r': case 'R': { double *d; d=malloc_2(sizeof(double)); *d = 0; sscanf(yytext+1,"%lg",d); errno = 0; get_strtoken(); v=bsearch_vcd(yytext, yylen); if(!v) { fprintf(stderr,"Near line %d, Unknown identifier: '%s'\n",vcdlineno, yytext); free_2(d); } else { lxt2_wr_emit_value_double(lt, v->ltsym, 0, *d); add_histent(current_time, v->narray[0],'g',1,(char *)d); free_2(d); } break; } case 's': case 'S': { get_strtoken(); /* simply skip for now */ break; } } }