void kconfig::SymbolTranslator::visit_tristate_symbol(struct symbol *sym) {
    ExpressionTranslator expTranslator(this->symbolSet);
    expr *rev = reverseDepExpression(sym);
    expr *vis = visibilityExpression(sym);
    expr *dep = dependsExpression(sym);
    expr *def = defaultExpression_bool_tristate(sym);

    Logging::debug("CONFIG ", sym->name, " (tristate)");
    BoolExp &f1yes = *B_VAR(sym, rel_yes);
    BoolExp &f1mod = *B_VAR(sym, rel_mod);

    TristateRepr transVis = expTranslator.process(vis);
    TristateRepr transDep = expTranslator.process(dep);
    TristateRepr transDef = expTranslator.process(def);
    TristateRepr transRev = expTranslator.process(rev);

    // invisible  symbols
    // f1->(s1|r1)
    BoolExp &Inv0 = !f1yes || (*transDef.yes || *transRev.yes);
    // f0 -> (s1|s0|r0)
    BoolExp &Inv1 = !f1mod || (*transDef.yes || *transDef.mod || *transRev.mod);
    // (s0|s1) -> (~(d1|d0) |f1 |f0)
    BoolExp &Inv2 = !(*transDef.mod || *transDef.yes)
                    || (!(*transDep.yes || *transDep.mod) || f1yes || f1mod);
    // (s1 & d1)-> f1
    BoolExp &Inv3 = !(*transDef.yes && *transDep.yes) || f1yes;

    BoolExp &completeInv = (*transVis.yes || *transVis.mod) || (Inv0 && Inv1 && Inv2 && Inv3);

    // visible symbols:
    // F1.yes-> dep.yes ||rev.yes
    BoolExp &FYes = *B_IMPL(&f1yes, &(*transDep.yes || *transRev.yes));
    // F1.mod-> rev.mod || dep.yes|| dep.mod ;
    BoolExp &FMod = !f1mod || *transRev.mod || *transDep.yes || *transDep.mod;
    // rev.yes -> F1.yes
    BoolExp &FRevYes = !*transRev.yes || f1yes;
    // rev.mod -> F1.yes || F1.mod
    BoolExp &FRevMod = !*transRev.mod || f1yes || f1mod;

    // mustn't become '11'
    BoolExp &guard = sym->type == S_BOOLEAN ? (!f1mod) : (!(f1yes && f1mod));

    this->pushSymbolInfo(sym);
    // this->addComment(sym->name ? sym->name : "Unnamed Menu Or Choice");
    this->addClause(FYes.simplify());

    this->addClause(FMod.simplify());
    this->addClause(FRevYes.simplify());
    this->addClause(FRevMod.simplify());
    this->addClause(completeInv.simplify());
    this->addClause(&guard);

    this->_featuresWithStringDep += (expTranslator.getValueComparisonCounter() > 0) ? 1 : 0;
    this->_totalStringComp += expTranslator.getValueComparisonCounter();

    expr_free(def);
    expr_free(dep);
    expr_free(vis);
    expr_free(rev);
}
void kconfig::SymbolTranslator::visit_choice_symbol(struct symbol *sym) {
    ExpressionTranslator expTranslator(this->symbolSet);
    TristateRepr transChoice = expTranslator.process(choiceExpression(sym));
    BoolExp &f1yes = *B_VAR(sym, rel_yes);

    if (sym->type == S_BOOLEAN) {
        Logging::debug("CONFIG ", sym->name, " (choice bool)");
        visit_bool_symbol(sym);
        // F1.yes-> choice.yes
        BoolExp &CYes = !f1yes || *transChoice.yes || *transChoice.mod;

        this->addClause(CYes.simplify());
    } else if (sym->type == S_TRISTATE) {
        Logging::debug("CONFIG ", sym->name, " (choice tri)");
        visit_tristate_symbol(sym);
        // F1.yes-> choice.yes
        BoolExp &CYes = !f1yes || *transChoice.yes;
        // F1.yes-> !choice.mod ;
        BoolExp &CMod = !f1yes || !*transChoice.mod;

        this->addClause(CYes.simplify());
        this->addClause(CMod.simplify());
        visit_tristate_symbol(sym);
    } else {
        throw "Invalid choice type";
    }

    this->_featuresWithStringDep += (expTranslator.getValueComparisonCounter() > 0) ? 1 : 0;
    this->_totalStringComp += expTranslator.getValueComparisonCounter();
}
void kconfig::SymbolTranslator::visit_bool_symbol(struct symbol *sym) {
    if (!sym)
        return;

    if (sym->name)
        Logging::debug("CONFIG ", sym->name, " (bool)");
    else
        Logging::debug("CONFIG <unnamed> (?)");

    ExpressionTranslator expTranslator(this->symbolSet);

    expr *rev = reverseDepExpression(sym);
    expr *vis = visibilityExpression(sym);
    expr *dep = dependsExpression(sym);
    expr *def = defaultExpression_bool_tristate(sym);

    BoolExp &f1yes = *B_VAR(sym, rel_yes);

    TristateRepr transVis = expTranslator.process(vis);
    TristateRepr transDep = expTranslator.process(dep);
    TristateRepr transDef = expTranslator.process(def);
    TristateRepr transRev = expTranslator.process(rev);

    // invisible  symbols
    // F1.yes->(rev.yes || rev.mod || def.yes ||def.mod)
    BoolExp &FDef = !f1yes || *transDef.yes || *transDef.mod || *transRev.yes || *transRev.mod;
    // ((def.yes||def.mod) && (dep.yes ||dep.mod)) -> f1
    BoolExp &FDefRev = !((*transDef.yes || *transDef.mod) && (*transDep.yes || *transDep.mod))
                       || f1yes;
    // !vis -> (FDef && FDefRev)
    BoolExp &completeInv = *transVis.yes || *transVis.mod || (FDef && FDefRev);

    // visible symbols:
    // F1.yes-> dep.yes || dep.mod || rev.yes || rev.mod
    BoolExp &FYes = !f1yes || *transDep.yes || *transDep.mod || *transRev.yes || *transRev.mod;
    // rev.yes -> F1.yes
    BoolExp &FRevYes = !*transRev.yes || f1yes;
    // rev.mod -> F1.yes
    BoolExp &FRevMod = !*transRev.mod || f1yes;
    this->pushSymbolInfo(sym);
    this->addClause(FYes.simplify());
    this->addClause(FRevYes.simplify());
    this->addClause(FRevMod.simplify());
    this->addClause(completeInv.simplify());

    this->_featuresWithStringDep += (expTranslator.getValueComparisonCounter() > 0) ? 1 : 0;
    this->_totalStringComp += expTranslator.getValueComparisonCounter();

    expr_free(def);
    expr_free(dep);
    expr_free(vis);
    expr_free(rev);
};
Beispiel #4
0
    S_VAR( "backspace-is-control-h", backspace_is_control_h, VAR_NUMBER, VAR_RW )
    S_VAR( "ungot-key", ungot_key, VAR_NUMBER, VAR_RW )
    S_VAR( "QEPATH", res_path, VAR_CHARS, VAR_RO )
    //S_VAR( "it", it, VAR_NUMBER, VAR_RW )
    S_VAR( "ignore-spaces", ignore_spaces, VAR_NUMBER, VAR_RW )
    S_VAR( "hilite-region", hilite_region, VAR_NUMBER, VAR_RW )
    S_VAR( "mmap-threshold", mmap_threshold, VAR_NUMBER, VAR_RW )
    S_VAR( "max-load-size", max_load_size, VAR_NUMBER, VAR_RW )
    S_VAR( "show-unicode", show_unicode, VAR_NUMBER, VAR_RW )
    S_VAR( "default-tab-width", default_tab_width, VAR_NUMBER, VAR_RW )
    S_VAR( "default-fill-column", default_fill_column, VAR_NUMBER, VAR_RW )
    S_VAR( "backup-inhibited", backup_inhibited, VAR_NUMBER, VAR_RW )

    //B_VAR( "screen-charset", charset, VAR_NUMBER, VAR_RW )

    B_VAR( "mark", mark, VAR_NUMBER, VAR_RW )
    B_VAR( "bufsize", total_size, VAR_NUMBER, VAR_RO )
    B_VAR( "bufname", name, VAR_CHARS, VAR_RO )
    B_VAR( "filename", filename, VAR_CHARS, VAR_RO )
    B_VAR( "tab-width", tab_width, VAR_NUMBER, VAR_RW )
    B_VAR( "fill-column", fill_column, VAR_NUMBER, VAR_RW )

    W_VAR( "point", offset, VAR_NUMBER, VAR_RW )
    W_VAR( "indent-width", indent_size, VAR_NUMBER, VAR_RW )
    W_VAR( "indent-tabs-mode", indent_tabs_mode, VAR_NUMBER, VAR_RW )
    W_VAR( "default-style", default_style, VAR_NUMBER, VAR_RW )
    W_VAR( "region-style", region_style, VAR_NUMBER, VAR_RW )
    W_VAR( "curline-style", curline_style, VAR_NUMBER, VAR_RW )
    W_VAR( "window-width", width, VAR_NUMBER, VAR_RW )
    W_VAR( "window-height", height, VAR_NUMBER, VAR_RW )
    W_VAR( "window-left", xleft, VAR_NUMBER, VAR_RW )