Example #1
0
bool CircuitCmp::proveSAT(Gate* one, Gate* two){
		vector<Gate*> dlistOne, dlistTwo;
		DFSearch(one, dlistOne);
      DFSearch(two, dlistTwo);
		resetTraversed(dlistOne);
		resetTraversed(dlistTwo);		

		solver.initialize();		
		genProofModel(dlistOne, dlistTwo);	
      Var v = solver.newVar();

	   if(one -> phase == two -> phase)
	      solver.addXorCNF(v, one  -> getVar(), false, two-> getVar(),false);
	   else if(one -> phase == !(two -> phase))
	      solver.addXorCNF(v, one -> getVar(), true, two-> getVar(), false);
   
      solver.assumeProperty(circuitOne -> constTrueGate -> getVar(), true);
      solver.assumeProperty(circuitOne -> constFalseGate -> getVar(), false);
      solver.assumeProperty(v, true);

	   bool result = solver.assumpSolve();
		//solver.printStats();

		return !result;
}
Example #2
0
void CircuitCmp::CountScore(){
	vector<int>score;
	int tmp;
	vector<Gate*> store;
	cout<<cutSet.size()<<endl;
	for(int i=0;i<cutSet.size();i++){
		for(int j=0;j<cutSet[i]->size();j++){
			cout<<cutSet[i]->at(j)->name<<endl;
			DFSearch(cutSet[i]->at(j)->input[0],store);
			tmp=0;			
			for(int k=0;k<store.size();k++){
				if(store[k]->gateType!=Input  && store[k]->gateType!=Wir)
					tmp++;
			}
			tmp++;
			if(tmp==1){
				cout<<"tmp=1"<<endl;
				assert(0);
			}
			score.push_back(tmp);
			store.clear();
		}
	}
	for(int i=0;i<circuitOne->output.size();i++){
		DFSearch(circuitOne->output[i]->input[0],store);
		resetTraversed(store);
		tmp=0;
		for(int j=0;j<store.size();j++){
			if(store[j]->gateType!=Input  && store[j]->gateType!=Wir)
				tmp++;		
		}
		score.push_back(tmp);
		store.clear();
		DFSearch(circuitTwo->output[i]->input[0],store);
		resetTraversed(store);
		tmp=0;
		for(int j=0;j<store.size();j++){
			if(store[j]->gateType!=Input && store[j]->gateType!=Wir)
				tmp++;		
		}
		score.push_back(tmp);
		store.clear();
	}
	intsort g;
	sort(score.begin(),score.end(),g);
	for(int i=0;i<score.size()-1;i++)
		cout<<score[i]<<",";
	cout<<score[score.size()-1]<<endl;
}
Example #3
0
/****DFS Function Definition****/
void DFS()
{ 
    int i;
    for(i=1;i<=n;i++)
        if(!visited[i])
        {
            if(i>1) connected=0;
            DFSearch(i);    
        } 
}
Example #4
0
void CircuitCmp::DFSearch(Gate* source, vector<Gate*>& List){
	source->traversed=true;
	if(source->gateType!=Wir || !(((Wire*)source)->isCut())){
		for(int i=0;i<source->input.size();i++){
			if(!(source->input[i]->traversed))
				DFSearch(source->input[i],List);
		}
	}
  	List.push_back(source);
}
Example #5
0
void CircuitCmp::RebuiltDFSlist(){
	int one=0,two=0;
	dfsListOne.clear();
	dfsListTwo.clear();
	circuitOne->resetTraversed();
	circuitTwo->resetTraversed();
	for(int i=0;i<circuitOne->output.size();i++){
		DFSearch(circuitOne->output[i],dfsListOne);
		DFSearch(circuitTwo->output[i],dfsListTwo);
	}
	for(int i=0;i<dfsListOne.size();i++)
		if(dfsListOne[i]->gateType==Wir && !(((Wire*)dfsListOne[i])->isCut()) && ((Wire*)dfsListOne[i])->potentialCut)
			one++;
	for(int i=0;i<dfsListTwo.size();i++)
		if(dfsListTwo[i]->gateType==Wir && !(((Wire*)dfsListTwo[i])->isCut()) && ((Wire*)dfsListTwo[i])->potentialCut)
			two++;
	cout<<one<<":"<<two<<endl;
	resetTraversed(dfsListOne);
	resetTraversed(dfsListTwo);
}
Example #6
0
/****DFSearch Function Definition****/
void DFSearch(int cur) 
{
    int i,j;
    visited[cur]=++count;

    seq[count]=cur; 
    for(i=1;i<count-1;i++)
        if(A[cur][seq[i]]) 
            acyclic=0;

    for(i=1;i<=n;i++)
        if(A[cur][i] && !visited[i])
            DFSearch(i);

}