static void aut_write_edge(lts_file_t file,int src_seg,void* src_state, int dst_seg,void*dst_state,void* labels){ (void)src_seg;(void)dst_seg; uint32_t src=*((uint32_t*)src_state); uint32_t dst=*((uint32_t*)dst_state); uint32_t lbl=*((uint32_t*)labels); if (src>=file->states) file->states=src+1; if (dst>=file->states) file->states=dst+1; file->trans++; value_table_t table=lts_file_get_table(file,file->type_no); if (table==NULL) { fprintf(file->f,"(%llu,%llu,%llu)\n", (long long unsigned int)src, (long long unsigned int)lbl, (long long unsigned int)dst); } else { chunk label_c=VTgetChunk(table,lbl); char label_s[label_c.len*2+6]; chunk2string(label_c,sizeof label_s,label_s); fprintf(file->f,"(%llu,%s,%llu)\n", (long long unsigned int)src, label_s, (long long unsigned int)dst); } }
void* HREgreyboxI2C(void*map,int idx,int*len){ chunk c=VTgetChunk((value_table_t)map,idx); *len=c.len; return c.data; }
static void write_close(lts_file_t file){ //if (file->init_count!=1) Abort("missing initial state"); in some cases no initial states makes sense! uint32_t pre_sum=0; for(int i=0;i<file->segments;i++) pre_sum+=file->state_perseg[i]; uint32_t tmp; for (int i=0;i<file->segments;i++){ tmp=lts_get_max_src_p1(file,i); if (tmp>file->state_perseg[i]) file->state_perseg[i]=tmp; tmp=lts_get_max_dst_p1(file,i); if (tmp>file->state_perseg[i]) file->state_perseg[i]=tmp; } file->state_count=0; for(int i=0;i<file->segments;i++) file->state_count+=file->state_perseg[i]; if (pre_sum && pre_sum!=file->state_count) { Abort("edges use unwritten states"); } uint32_t offset[file->segments]; offset[0]=0; for(int i=1;i<file->segments;i++) offset[i]=offset[i-1]+file->state_perseg[i-1]; uint32_t seg,ofs; for(uint32_t i=0;i<file->lts->root_count;i++){ seg=file->lts->root_list[i]%file->segments; ofs=file->lts->root_list[i]/file->segments; file->lts->root_list[i]=offset[seg]+ofs; } for(uint32_t i=0;i<file->edge_count;i++){ seg=file->lts->src[i]%file->segments; ofs=file->lts->src[i]/file->segments; file->lts->src[i]=offset[seg]+ofs; seg=file->lts->dest[i]%file->segments; ofs=file->lts->dest[i]/file->segments; file->lts->dest[i]=offset[seg]+ofs; } if (file->lts->properties){ uint32_t* temp=file->lts->properties; file->lts->properties=(uint32_t*)RTmalloc(file->state_count*sizeof(uint32_t)); for(int i=0;i<file->segments;i++){ for(uint32_t j=0;j<file->state_perseg[i];j++){ file->lts->properties[offset[i]+j]=temp[j*file->segments+i]; } } RTfree(temp); } lts_set_size(file->lts,file->init_count,file->state_count,file->edge_count); file->lts->tau=-1; if (lts_type_get_edge_label_count(file->lts->ltstype)==1 && strncmp(lts_type_get_edge_label_name(file->lts->ltstype,0),LTSMIN_EDGE_TYPE_ACTION_PREFIX,6)==0) { Print(infoShort,"action labeled, detecting silent step"); int tableno=lts_type_get_edge_label_typeno(file->lts->ltstype,0); value_table_t vt=file->lts->values[tableno]; int N=VTgetCount(vt); for(int i=0;i<N;i++){ chunk c=VTgetChunk(vt,i); if ( (c.len==strlen(LTSMIN_EDGE_VALUE_TAU) && strcmp(c.data,LTSMIN_EDGE_VALUE_TAU)==0) || (c.len==1 && strcmp(c.data,"i")==0) ) { Print(infoShort,"invisible label is %s",c.data); if (file->lts->tau>=0) Abort("two silent labels"); file->lts->tau=i; } } if (file->lts->tau<0) { Print(infoShort,"no silent label"); } } }