/*******************************************************************************
*	fonctions de visualisation d'un Graphe Factorise (GF) .		       *
*									       *
*	version du jeudi 28 MARS 91					       *
*******************************************************************************/
#include<stdio.h>
#include MUT_H
#include LOG_H
#include"fact.h"

void displayFact(pt)
pFact pt;
{
printf("noeud : %d\n",pt) ;
printf("\tg : %d, h : %d, r : %d\n",pt->g,pt->h,pt->r);
}


/* affichage des elements de la table */

void displayTabFact(tabFact)
pTabFact tabFact;
{
int i;
int co=0;
pFact fact;

fact = tabFact->tetFact; 
printf("\n---------------------------------------------------------------");
printf("---------\n               AFFICHAGE DE LA TABLE DE HACHAGE\n\n");
for (i=0;i<tabFact->lenTable;i++)
    {
       printf("****** indice %d ****** \n",i);
       printf("fact = %d\n",fact);
    fact++;
    }
}
/*------------------------------------------------------------------------------
displayChainFact	:	visualise une forme factorisee.
-----------------------------------------------------------------
parametres	:	pGF : pointeur sur tete GF .
			tabInput : pointeur sur la table des var_index .
-----------------------------------------------------------------
return		:	void .
------------------------------------------------------------------------------*/
void displayChainFact(pGF,tabInput)
pFact pGF ;
char **tabInput ;
{
char *g ;

if(pGF == oneFact)
	printf(" 1\n") ;
else
	if(pGF == zeroFact)
		printf(" 0\n") ;
	else
		{
		g = driveBdd(pGF->g,tabInput) ; 
		printf("(%s)",g) ;
		if(pGF->h == zeroFact)
			printf("****pGF : %d, g : %s,h:%d, r:%d\n",pGF,g,pGF->h,pGF->r) ;
		if(pGF->h != oneFact && pGF->h != zeroFact)
			{
			printf("(") ;
			displayChainFact(pGF->h,tabInput) ; 
			printf(")") ;
			}
		if(pGF->r != zeroFact)
			{
			printf(" + ") ;
			displayChainFact(pGF->r,tabInput) ;
			}
		}
}
/*------------------------------------------------------------------------------
DriveBdd	:	visualise un bdd sous la forme la plus elementaire .
-----------------------------------------------------------------
parametres	:	pBdd : pointeur sur bdd a visualiser .
			tabInput : pointeur sur la table des var_index .
-----------------------------------------------------------------
return		:	chaine de caractere expression logique .
------------------------------------------------------------------------------*/
char *driveBdd(pBdd,tabInput)
pNode pBdd ;
char **tabInput ;
{
char *expr ;
char *var ;

if(pBdd->index == 1)
	{
	expr = "1" ;
	return(expr) ;
	}	
if(pBdd->index == 0)
	{
	expr = "0" ;
	return(expr) ;
	}	
expr = (char *) mbkalloc(100) ;
var = tabInput[pBdd->index - 2] ; /* index 2 est l'element num 0 de la table */
strcpy(expr,var) ;
if(pBdd->high == zero)
	if(pBdd->low == one)
		strcat(expr,"'") ;
	else
		{
		/*printf("************* BDD complexe dans GF\n") ;*/
		strcat(expr,"'") ;
		strcat(expr,driveBdd(pBdd->low,tabInput)) ;
		}
else
	if(pBdd->high == one)
		{
		if(pBdd->low != zero)
			{
			/*printf("************* BDD complexe dans GF\n") ;*/
			strcat(expr," + a'") ;
			strcat(expr,driveBdd(pBdd->low,tabInput)) ;
			}	
		}
	else
		{
		/*printf("************* BDD complexe dans GF\n") ;*/
		if(pBdd->low == one) /* a' + aG = a' + G */
			{
			strcat(expr,"' + ") ;
			strcat(expr,driveBdd(pBdd->high,tabInput)) ;
			}
		else
			{
			strcat(expr,driveBdd(pBdd->high,tabInput)) ;
			if(pBdd->low != zero)
				{
				strcat(expr," + ") ;
				strcat(expr,var) ;
				strcat(expr,"'") ;
				strcat(expr,driveBdd(pBdd->low,tabInput)) ;
				}
			}
		}
return(expr) ;
}
/*------------------------------------------------------------------------------
displayTabRH	:	visualise table des var, F, H .
-----------------------------------------------------------------
parametres	:	tabVar : la table des variables .
			tabH : la table des H .
			tabR : la table des R .
			tabInput : table des entrees .
-----------------------------------------------------------------
return		:	void .
------------------------------------------------------------------------------*/
void displayTabRH(tabInput,tabH,tabR,tabVar)
char **tabInput ;
pNode *tabVar ;
pNode *tabH ;
pNode *tabR ;
{
int i,j ;

for(i = 0;tabVar[i] != NULL; i++)
	{
	for(j = i + 1; tabVar[j] != NULL; j++)
		{
		if(tabH[i] != one && tabH[i] != zero && tabH[i] == tabH[j])
			{
			displayExpr(bddToAbl(tabVar[i],tabInput)) ;
			printf("	et	") ;
			displayExpr(bddToAbl(tabVar[j],tabInput)) ;
			printf("\n") ;
			}
		if(tabH[i] != one && tabH[i] != zero && tabH[i] == tabR[j])
			{
			displayExpr(bddToAbl(tabVar[i],tabInput)) ;
			printf("	et	") ;
			displayExpr(bddToAbl(notBdd(tabVar[j]),tabInput)) ;
			printf("\n") ;
			}
		if(tabR[i] != one && tabR[i] != zero && tabR[i] == tabH[j])
			{
			displayExpr(bddToAbl(notBdd(tabVar[i]),tabInput)) ;
			printf("	et	") ;
			displayExpr(bddToAbl(tabVar[j],tabInput)) ;
			printf("\n") ;
			}
		if(tabR[i] != one && tabR[i] != zero && tabR[i] == tabR[j])
			{
			displayExpr(bddToAbl(notBdd(tabVar[i]),tabInput)) ;
			printf("	et	") ;
			displayExpr(bddToAbl(notBdd(tabVar[j]),tabInput)) ;
			printf("\n") ;
			}
		}
/*
	printf("**** var : %s\n",tabInput[(((pNode)tabVar[i])->index) - 2]) ;
	printf("\tH : ") ;
	displayExpr(bddToAbl(tabH[i],tabInput)) ;
	printf("\n") ;
	printf("\tR : ") ;
	displayExpr(bddToAbl(tabR[i],tabInput)) ;
	printf("\n") ;
*/
	}
}
/*------------------------------------------------------------------------------
displayTabPBdd	: visualise la table des pointeurs de BDD .
-------------------------------------------------------
parametres 	: pTabBdd .
-------------------------------------------------------
return 		: void .
------------------------------------------------------------------------------*/
void displayTabPBdd(pC,pTabBdd)
pCircuit pC ;
pNode *pTabBdd ;
{
int i ;
chain_list *abl ;

printf("*********** VISUALISATION DE LA TABLE DES BDD **************\n") ;
for(i = 0; pTabBdd[i] != NULL; i++)
	{
	
	printf("****** tabBdd[%d] = %d\n",i,pTabBdd[i]) ;
/*	displayBdd(1,pTabBdd[i]) ;*/
/*	
	abl = (chain_list *)bddToAbl(pTabBdd[i],pC->pNameI) ;
	displayExpr(abl) ;
*/	
	}
printf("*********** FIN DE LA VISUALISATION **************\n") ;
}
