Пример #1
0
// State: (PC0:int, PC1:int, turn:int, flags:array)
// flag[0] = true;
int pg_transition_p0_0(model_t model, int*src,TransitionCB callback,void*user_context) {
    int dst[state_length()]; // the next state values
    // not all variables are modified so copy the source state
    memcpy(dst, src, sizeof(int) * state_length()); 

    dst[0] = 1;  // PC0 = 1

    // set the chunk
    int index = src[3];
    chunk res=GBchunkGet(model, char_array_type, index);
    char *flags_old = res.data;

    char flags[2] = {};
    flags[0] = 1;
    flags[1] = flags_old[1];
    index = GBchunkPut(model, char_array_type, chunk_ld(2, flags));
    dst[3] = index;

    int action[1];
    action[0] = action0_index;
    transition_info_t transition_info = { action, 0 };

    int cpy[4] = {1,0,0,1}; // provide modified variables
    callback(user_context, &transition_info, dst, cpy);
    return 1; // return number of successors
}
Пример #2
0
int* initial_state(model_t model) {
    initial[0] = 0;   // PC0
    initial[1] = 0;   // PC1
    initial[2] = 0;   // turn = 0

    char flags[2] = {};
    flags[0] = 0;
    flags[1] = 0;
    int index = GBchunkPut(model, char_array_type, chunk_ld(2, flags));
    initial[3] = index;

    return initial;
}
Пример #3
0
static chunk get_chunk(value_table_t vt,value_index_t idx){
    int len;
    char* data=SIgetC(vt->index,idx,&len);
    if (data==NULL) {
        if (HREme(vt->ctx)==0) Abort("chunk %d does not exist",idx);
        Debug("looking up index %d",idx);
        if (vt->msg_pending) HREyieldWhile(vt->ctx,&vt->msg_pending);
        vt->task=idx;
        memcpy(vt->msg->buffer,&idx,4);
        vt->msg->tail=4;
        vt->task_pending=1;
        vt->msg_pending=1;
        HREpostSend(vt->msg);
        HREyieldWhile(vt->ctx,&vt->task_pending);
        data=SIgetC(vt->index,idx,&len);
        data[len]=0;
        Debug("got %s (%d)",data,vt->msg_pending);
    }
    return chunk_ld(len,data);
}
Пример #4
0
static int aut_read_edge(lts_file_t file,int *src_seg,void* src_state,
                         int *dst_seg,void*dst_state,void* labels){
    *src_seg=0;
    *dst_seg=0;
    char buffer[BUFFER_SIZE];
    errno=0;
    if (fgets(buffer,BUFFER_SIZE,file->f)==NULL){
        if (errno) AbortCall("while reading %s",lts_file_get_name(file));
        return 0;
    }
    int from_idx,from_end,label_idx,to_idx,i;
// find destination state and end of label
    for(i=strlen(buffer);!isdigit((unsigned char)buffer[i]);i--);
    buffer[i+1]=0;
    for(;isdigit((unsigned char)buffer[i]);i--);
    to_idx=i+1;
    for(;buffer[i]!=',';i--);
    for(i--;isblank((unsigned char)buffer[i]);i--);
    buffer[i+1]=0;
// find source state and begin of label
    for(i=0;!isdigit((unsigned char)buffer[i]);i++);
    from_idx=i;
    for(;isdigit((unsigned char)buffer[i]);i++);
    from_end=i;
    for(;buffer[i]!=',';i++);
    for(i++;isblank((unsigned char)buffer[i]);i++);
    buffer[from_end]='\00';
    label_idx=i;
    int lbl_len=strlen(buffer+label_idx);
    char tmp_data[lbl_len];
    chunk tmp_chunk=chunk_ld(lbl_len,tmp_data);
    string2chunk(buffer+label_idx,&tmp_chunk);
// write the results
    *((uint32_t*)src_state)=(uint32_t)atoll(buffer+from_idx);
    *((uint32_t*)labels)=VTputChunk(lts_file_get_table(file,file->type_no),tmp_chunk);
    *((uint32_t*)dst_state)=(uint32_t)atoll(buffer+to_idx);
    return 1;

}
Пример #5
0
static void lts_read_dir(archive_t archive,lts_t lts){
    Print(infoShort,"opening info");
    stream_t input=arch_read(archive,"info");
    dir_info_t info=DIRinfoRead(input,1);
    DSclose(&input);
    int segments=info->segment_count;
    Print(infoShort,"got info for %d segments",segments);
    int offset[segments];
    offset[0]=0;
    for(int i=1;i<segments;i++){
        offset[i]=info->state_count[i-1]+offset[i-1];
    }
    int s_count=0;
    int t_count=0;
    for(int i=0;i<segments;i++){
        s_count+=info->state_count[i];
        for(int j=0;j<segments;j++){
            t_count+=info->transition_count[i][j];
        }
    }
    Print(infoShort,"counted %u states and %u transitions",s_count,t_count);
    lts_set_sig(lts,single_action_type());
    lts_set_type(lts,LTS_LIST);
    lts_set_size(lts,1,s_count,t_count);
    lts->root_list[0]=offset[info->initial_seg]+info->initial_ofs;
    lts->tau=info->label_tau;
    Print(infoShort,"getting %d labels from TermDB",info->label_count);
    input=arch_read(archive,"TermDB");
    int type_no=lts_type_get_edge_label_typeno(lts->ltstype,0);
    for(int i=0;i<info->label_count;i++){
        char *line=DSreadLN(input);
        int len=strlen(line);
        char data[len];
        chunk tmp_chunk=chunk_ld(len,data);
        string2chunk(line,&tmp_chunk);
        VTputAtChunk(lts->values[type_no], tmp_chunk, i);
    }
    DSclose(&input);
    Print(infoShort,"got labels");
    int t_offset=0;
    char filename[1024];
    for(int i=0;i<segments;i++){
        for(int j=0;j<segments;j++){
            sprintf(filename,"src-%d-%d",i,j);
            stream_t src=arch_read(archive,filename);
            sprintf(filename,"label-%d-%d",i,j);
            stream_t lbl=arch_read(archive,filename);
            sprintf(filename,"dest-%d-%d",i,j);
            stream_t dst=arch_read(archive,filename);
            for(int k=0;k<info->transition_count[i][j];k++){
                lts->src[t_offset]=offset[i]+DSreadU32(src);
                lts->label[t_offset]=DSreadU32(lbl);
                lts->dest[t_offset]=offset[j]+DSreadU32(dst);
                t_offset++;
            }
            DSclose(&src);
            DSclose(&lbl);
            DSclose(&dst);
        }
    }
    DIRinfoDestroy(info);
}
Пример #6
0
void HREgreyboxCAtI(void*map,void*data,int len,int pos){
    return VTputAtChunk((value_table_t)map,chunk_ld(len,data),pos);
}
Пример #7
0
int HREgreyboxC2I(void*map,void*data,int len){
    return VTputChunk((value_table_t)map,chunk_ld(len,data));
}