예제 #1
0
파일: semc1.c 프로젝트: aiju/hdl
/* determine the initializer type corresponding to an expression */
static int
inittype(ASTNode *n)
{
    if(n == nil) return SINONE;
    switch(n->t) {
    case ASTCINT:
    case ASTCONST:
        return SINONE;
    case ASTDEFAULT:
        return SIDEF;
    case ASTSYMB:
        if(n->sym == nil || n->sym->clock == nil)
            return SIINVAL;
        switch(n->sym->clock->t) {
        case ASTASYNC:
            return SIASYNC;
        default:
            return SISYNC;
        }
    case ASTOP:
        return initjoin(inittype(n->n1), inittype(n->n2));
    case ASTTERN:
        return initjoin(initjoin(inittype(n->n1), inittype(n->n2)), inittype(n->n3));
    default:
        error(n, "exprtype: unknown %A", n->t);
        return SIINVAL;
    }
}
예제 #2
0
DL_EXPORT(void) initproperties()
{
    PyObject *m, *d;

    m = Py_InitModule("properties", (PyMethodDef*) module_methods);
    d = PyModule_GetDict(m);

    PyModule_AddConstants(d,&module_constants[0]);
    
    inittype("Property", m, &tProperty, &property_constants[0]);
}
예제 #3
0
파일: semc1.c 프로젝트: aiju/hdl
/* process all initial blocks */
static void
initial(SemDefs *glob)
{
    Nodes *r, *s;
    int t;

    for(r = initbl; r != nil; r = r->next) {
        for(s = r->n->nl; s != nil; s = s->next) {
            t = inittype(s->n);
            if(t == SIINVAL || t == SINONE)
                error(s->n, "'%n' not a valid trigger", s->n);
        }
        initial1(r->n->n1, r->n->nl, glob);
    }
}
예제 #4
0
파일: semc1.c 프로젝트: aiju/hdl
/* process statement in initial block with triggers tr,
   creating SemInit structures for all triggers. */
static void
initial1(ASTNode *n, Nodes *tr, SemDefs *glob)
{
    Nodes *r;
    SemVar *v;
    SemInit *si, **p;
    int t;

    if(n == nil) return;
    switch(n->t) {
    case ASTASS:
        assert(n->n1 != nil);
        if(n->n1->t != ASTSYMB) {
            error(n, "initial1: unknown lval %A", n->n1->t);
            return;
        }
        assert(n->n1->sym != nil);
        v = n->n1->sym->semc[0];
        assert(v != nil);
        if((v->flags & SVREG) == 0) {
            warn(n, "'%s' initial assignment ignored", v->sym->name);
            break;
        }
        for(r = tr; r != nil; r = r->next) {
            t = inittype(r->n);
            if(t == SIINVAL || t == SINONE) continue;
            for(p = &v->init; *p != nil; p = &(*p)->vnext)
                if(nodeeq((*p)->trigger, r->n, nodeeq)) {
                    error(n, "'%s' conflicting initial value", v->sym->name);
                    break;
                }
            if(*p != nil) continue;
            si = emalloc(sizeof(SemInit));
            si->trigger = onlyone(ssabuildbl(r->n, glob, 0));
            si->type = t;
            si->var = v;
            si->val = n->n2;
            *p = si;
        }
        break;
    case ASTBLOCK:
        for(r = n->nl; r != nil; r = r->next)
            initial1(r->n, tr, glob);
        break;
    default:
        error(n, "initial1: unknown %A", n->t);
    }
}