43 class RelationGenerator {
56 static Abc_RData_t* constructABCRelationRepresentation(
Vec_Int_t * patterns,
int nof_inputs,
int nof_outputs);
67 class RelationGeneratorABC :
public RelationGenerator<RelationGeneratorABC> {
75 std::unordered_set<int> inputs_in_forbidden_pairs;
77 friend RelationGenerator;
92 : pGia(pGia), subcir(subcir) {
100 if ( relation_patterns_masks == NULL ) {
103 int nof_inputs = subcir.nof_inputs;
104 int nof_outputs = Vec_IntSize(subcir.io) - subcir.nof_inputs;
105 Abc_RData_t* r = constructABCRelationRepresentation(relation_patterns_masks, nof_inputs, nof_outputs);
106 Vec_IntFree(relation_patterns_masks);
110 template <
typename T>
111 inline Abc_RData_t* RelationGenerator<T>::constructABCRelationRepresentation(
Vec_Int_t * patterns,
int nof_inputs,
int nof_outputs) {
113 int nof_vars = nof_inputs + nof_outputs;
114 Abc_RData_t*
p = Abc_RDataStart( nof_inputs, nof_outputs, Vec_IntSize(patterns) );
116 for (
int k = 0; k < nof_vars; k++ ) {
117 if ( (mask >> (nof_vars-1-k)) & 1 ) {
118 if ( k < nof_inputs ) {
119 Abc_RDataSetIn(
p, k, i );
121 Abc_RDataSetOut(
p, 2*(k-nof_inputs)+1, i );
124 if ( k >= nof_inputs ) {
125 Abc_RDataSetOut(
p, 2*(k-nof_inputs), i );
135 template <
typename T>
140 Vec_Wrd_t * vSimsIn2 = Vec_WrdStart( 64*
p->nSimWords );
141 Vec_Wrd_t * vSimsOut2 = Vec_WrdStart( 64*
p->nSimWords );
142 for ( w = 0; w <
p->nIns; w++ )
143 Abc_TtCopy( Vec_WrdEntryP(vSimsIn2, w*
p->nSimWords), Vec_WrdEntryP(
p->vSimsIn, w*
p->nSimWords),
p->nSimWords, 0 );
144 for ( w = 0; w <
p->nOuts; w++ )
145 Abc_TtCopy( Vec_WrdEntryP(vSimsOut2, w*
p->nSimWords), Vec_WrdEntryP(
p->vSimsOut, (2*w+1)*
p->nSimWords),
p->nSimWords, 0 );
146 Vec_Wrd_t * vTransIn = Vec_WrdStart( 64*
p->nSimWords );
147 Vec_Wrd_t * vTransOut = Vec_WrdStart( 64*
p->nSimWords );
150 Vec_WrdShrink( vTransIn,
p->nPats );
151 Vec_WrdShrink( vTransOut,
p->nPats );
152 Vec_Wrd_t * vTransInCopy = Vec_WrdDup(vTransIn);
153 Vec_WrdUniqify( vTransInCopy );
157 Abc_RData_t * pNew = Abc_RDataStart(
p->nIns, 1 << (
p->nOuts-1), Vec_WrdSize(vTransInCopy) );
158 pNew->nOuts =
p->nOuts;
159 int i, k, n, iLine = 0;
word Entry, Entry2;
161 for ( n = 0; n <
p->nIns; n++ )
162 if ( (Entry >> n) & 1 )
163 Abc_InfoSetBit( (
unsigned *)Vec_WrdEntryP(pNew->vSimsIn, n*pNew->nSimWords), iLine );
165 if ( Entry != Entry2 )
167 Entry2 = Vec_WrdEntry( vTransOut, k );
168 assert( Entry2 < (1 <<
p->nOuts) );
169 Abc_InfoSetBit( (
unsigned *)Vec_WrdEntryP(pNew->vSimsOut, Entry2*pNew->nSimWords), iLine );
173 assert( iLine == pNew->nPats );
174 Vec_WrdFree( vTransOut );
175 Vec_WrdFree( vTransInCopy );
176 Vec_WrdFree( vTransIn );
177 Vec_WrdFree( vSimsIn2 );
178 Vec_WrdFree( vSimsOut2 );
182 template <
typename T>
183 inline void RelationGenerator<T>::setup() {
184 static_cast<T*
>(
this)->setupImpl();
187 template <
typename T>
188 inline Vec_Int_t* RelationGenerator<T>::getRelation() {
189 return static_cast<T*
>(
this)->getRelationImpl();