Extract clock enable

From Verific Design Automation FAQ
Jump to: navigation, search

Here is a small example which will extract clock-enables for every DFF in the design.

It uses both CheckDriverFrom() (to check if there is any potential clock-enable) as well as ExtractCondition() to actually extract the clock-enables and reorganize the logic.

Please note that this (clock-enable and set/reset extraction) is pretty dependent on the STRUCTURE of the logic. We rely on MUX2's to be there, so that data and control flow is still clearly recognizable.

MapIter mi ;
Instance *inst ;

// Extract clock-enables. (this goes best without any optimization to the netlist)
FOREACH_INSTANCE_OF_NETLIST(this, mi, inst) {
    if (inst->Type() != PRIM_DFFRS && inst->Type() != PRIM_DFF) continue ;

    // Go to d-input :
    Net *d = inst->GetInput() ;
    Net *q = inst->GetOutput() ;
    if (!d) continue ;

    Set check_list(POINTER_HASH) ;
    // Check clock-enable extraction :
    if (d->CheckDriverFrom(q, check_list)) {
    // Go an extract the condition :
    Net *drive_cond = 0 ;
    Map drive_conditions(POINTER_HASH) ;
    Map return_values(POINTER_HASH) ;
    // FIX ME : We might not need to replicate the cone. Only if fanout is encountered...
    Net *new_d = d->ExtractCondition(q, &drive_cond, 0/*don't need z-condition */, 1 /*replicate*/, drive_conditions, return_values) ;
    if (!drive_cond) continue ; // if no feedback condition was found after all, leave circuit as-is ?

    // Create a MUX with feedback loop from q :
    new_d = inst->Owner()->Mux(q, new_d, drive_cond, inst->Linefile()) ;

    // Replace existing d input with this new one :
    Port *d_port = inst->View()->GetInput() ;
    inst->Disconnect(d_port) ;
    inst->Connect(d_port, new_d) ;
    }
}