blob: 2faf09812fec019ef95017f1ad8cf8d16ec03ed1 [file] [log] [blame]
/**CFile****************************************************************
FileName [literal.h]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [RPO]
Synopsis [Literal structure]
Author [Mayler G. A. Martins / Vinicius Callegaro]
Affiliation [UFRGS]
Date [Ver. 1.0. Started - May 08, 2013.]
Revision [$Id: literal.h,v 1.00 2013/05/08 00:00:00 mgamartins Exp $]
***********************************************************************/
#ifndef ABC__bool__rpo__literal_h
#define ABC__bool__rpo__literal_h
////////////////////////////////////////////////////////////////////////
/// INCLUDES ///
////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include "bool/kit/kit.h"
#include "misc/vec/vec.h"
#include "misc/util/abc_global.h"
ABC_NAMESPACE_HEADER_START
////////////////////////////////////////////////////////////////////////
/// PARAMETERS ///
////////////////////////////////////////////////////////////////////////
// associations
typedef enum {
LIT_NONE = 0, // 0: unknown
LIT_AND, // 1: AND association
LIT_OR, // 2: OR association
LIT_XOR // 3: XOR association (not used yet)
} Operator_t;
typedef struct Literal_t_ Literal_t;
struct Literal_t_ {
unsigned * transition;
unsigned * function;
Vec_Str_t * expression;
};
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis [Compute the positive transition]
Description [The inputs are a function, the number of variables and a variable index and the output is a function]
SideEffects [Should this function be in kitTruth.c ?]
SeeAlso []
//
***********************************************************************/
static inline void Lit_TruthPositiveTransition( unsigned * pIn, unsigned * pOut, int nVars, int varIdx )
{
unsigned * cof0 = ABC_ALLOC (unsigned, Kit_TruthWordNum(nVars) );
unsigned * cof1 = ABC_ALLOC (unsigned, Kit_TruthWordNum(nVars) );
unsigned * ncof0;
Kit_TruthCofactor0New(cof0, pIn,nVars,varIdx);
Kit_TruthCofactor1New(cof1, pIn,nVars,varIdx);
ncof0 = ABC_ALLOC (unsigned, Kit_TruthWordNum(nVars) );
Kit_TruthNot(ncof0,cof0,nVars);
Kit_TruthAnd(pOut,ncof0,cof1, nVars);
ABC_FREE(cof0);
ABC_FREE(ncof0);
ABC_FREE(cof1);
}
/**Function*************************************************************
Synopsis [Compute the negative transition]
Description [The inputs are a function, the number of variables and a variable index and the output is a function]
SideEffects [Should this function be in kitTruth.c ?]
SeeAlso []
***********************************************************************/
static inline void Lit_TruthNegativeTransition( unsigned * pIn, unsigned * pOut, int nVars, int varIdx )
{
unsigned * cof0 = ABC_ALLOC (unsigned, Kit_TruthWordNum(nVars) );
unsigned * cof1 = ABC_ALLOC (unsigned, Kit_TruthWordNum(nVars) );
unsigned * ncof1;
Kit_TruthCofactor0New(cof0, pIn,nVars,varIdx);
Kit_TruthCofactor1New(cof1, pIn,nVars,varIdx);
ncof1 = ABC_ALLOC (unsigned, Kit_TruthWordNum(nVars) );
Kit_TruthNot(ncof1,cof1,nVars);
Kit_TruthAnd(pOut,ncof1,cof0,nVars);
ABC_FREE(cof0);
ABC_FREE(cof1);
ABC_FREE(ncof1);
}
/**Function*************************************************************
Synopsis [Create a literal given a polarity ]
Description [The inputs are the function, index and its polarity and a the output is a literal]
SideEffects []
SeeAlso []
***********************************************************************/
static inline Literal_t* Lit_Alloc(unsigned* pTruth, int nVars, int varIdx, char pol) {
unsigned * transition;
unsigned * function;
Vec_Str_t * exp;
Literal_t* lit;
assert(pol == '+' || pol == '-');
transition = ABC_ALLOC(unsigned, Kit_TruthWordNum(nVars));
if (pol == '+') {
Lit_TruthPositiveTransition(pTruth, transition, nVars, varIdx);
} else {
Lit_TruthNegativeTransition(pTruth, transition, nVars, varIdx);
}
if (!Kit_TruthIsConst0(transition,nVars)) {
function = ABC_ALLOC(unsigned, Kit_TruthWordNum(nVars));
Kit_TruthIthVar(function, nVars, varIdx);
//Abc_Print(-2, "Allocating function %X %d %c \n", *function, varIdx, pol);
exp = Vec_StrAlloc(5);
if (pol == '-') {
Kit_TruthNot(function, function, nVars);
Vec_StrPutC(exp, '!');
}
Vec_StrPutC(exp, (char)('a' + varIdx));
Vec_StrPutC(exp, '\0');
lit = ABC_ALLOC(Literal_t, 1);
lit->function = function;
lit->transition = transition;
lit->expression = exp;
return lit;
} else {
ABC_FREE(transition); // free the function.
return NULL;
}
}
/**Function*************************************************************
Synopsis [Group 2 literals using AND or OR]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline Literal_t* Lit_GroupLiterals(Literal_t* lit1, Literal_t* lit2, Operator_t op, int nVars) {
unsigned * newFunction = ABC_ALLOC(unsigned, Kit_TruthWordNum(nVars));
unsigned * newTransition = ABC_ALLOC(unsigned, Kit_TruthWordNum(nVars));
Vec_Str_t * newExp = Vec_StrAlloc(lit1->expression->nSize + lit2->expression->nSize + 3);
Literal_t* newLiteral;
char opChar = '%';
switch (op) {
case LIT_AND:
{
//Abc_Print(-2, "Grouping AND %X %X \n", *lit1->function, *lit2->function);
Kit_TruthAnd(newFunction, lit1->function, lit2->function, nVars);
opChar = '*';
break;
}
case LIT_OR:
{
//Abc_Print(-2, "Grouping OR %X %X \n", *lit1->function, *lit2->function);
Kit_TruthOr(newFunction, lit1->function, lit2->function, nVars);
opChar = '+';
break;
}
default:
{
Abc_Print(-2, "Lit_GroupLiterals with op not defined.");
//TODO Call ABC Abort
}
}
Kit_TruthOr(newTransition, lit1->transition, lit2->transition, nVars);
// create a new expression.
Vec_StrPutC(newExp, '(');
Vec_StrAppend(newExp, lit1->expression->pArray);
//Vec_StrPop(newExp); // pop the \0
Vec_StrPutC(newExp, opChar);
Vec_StrAppend(newExp, lit2->expression->pArray);
//Vec_StrPop(newExp); // pop the \0
Vec_StrPutC(newExp, ')');
Vec_StrPutC(newExp, '\0');
newLiteral = ABC_ALLOC(Literal_t, 1);
newLiteral->function = newFunction;
newLiteral->transition = newTransition;
newLiteral->expression = newExp;
return newLiteral;
}
/**Function*************************************************************
Synopsis [Create a const literal ]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline Literal_t* Lit_CreateLiteralConst(unsigned* pTruth, int nVars, int constant) {
Vec_Str_t * exp = Vec_StrAlloc(3);
Literal_t* lit;
Vec_StrPutC(exp, (char)('0' + constant));
Vec_StrPutC(exp, '\0');
lit = ABC_ALLOC(Literal_t, 1);
lit->expression = exp;
lit->function = pTruth;
lit->transition = pTruth; // wrong but no effect ###
return lit;
}
static inline Literal_t* Lit_Copy(Literal_t* lit, int nVars) {
Literal_t* newLit = ABC_ALLOC(Literal_t,1);
newLit->function = ABC_ALLOC(unsigned, Kit_TruthWordNum(nVars));
Kit_TruthCopy(newLit->function,lit->function,nVars);
newLit->transition = ABC_ALLOC(unsigned, Kit_TruthWordNum(nVars));
Kit_TruthCopy(newLit->transition,lit->transition,nVars);
newLit->expression = Vec_StrDup(lit->expression);
// Abc_Print(-2,"Copying: %s\n",newLit->expression->pArray);
return newLit;
}
static inline void Lit_PrintTT(unsigned* tt, int nVars) {
int w;
for(w=nVars-1; w>=0; w--) {
Abc_Print(-2, "%08X", tt[w]);
}
}
static inline void Lit_PrintExp(Literal_t* lit) {
Abc_Print(-2, "%s", lit->expression->pArray);
}
/**Function*************************************************************
Synopsis [Delete the literal ]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline void Lit_Free(Literal_t * lit) {
if(lit == NULL) {
return;
}
// Abc_Print(-2,"Freeing: %s\n",lit->expression->pArray);
ABC_FREE(lit->function);
ABC_FREE(lit->transition);
Vec_StrFree(lit->expression);
ABC_FREE(lit);
}
ABC_NAMESPACE_HEADER_END
#endif /* LITERAL_H */