Пример #1
0
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);
    }
}
Пример #2
0
void* HREgreyboxI2C(void*map,int idx,int*len){
    chunk c=VTgetChunk((value_table_t)map,idx);
    *len=c.len;
    return c.data;
}
Пример #3
0
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");
        }
    }
}