Only sort leaves on non-ANDNOT/ORNOT cells

This commit is contained in:
Eddie Hung 2019-08-14 11:25:56 -07:00
parent e2797f1308
commit 5ec5f6dec7
1 changed files with 7 additions and 6 deletions

View File

@ -153,10 +153,11 @@ struct ExtractFaWorker
}
}
void check_partition(SigBit root, pool<SigBit> &leaves)
void check_partition(SigBit root, pool<SigBit> &leaves, IdString cell_type)
{
if (config.enable_ha && GetSize(leaves) == 2)
{
if (!cell_type.in("$_ANDNOT_", "$_ORNOT_"))
leaves.sort();
SigBit A = SigSpec(leaves)[0];
@ -237,7 +238,7 @@ struct ExtractFaWorker
}
}
void find_partitions(SigBit root, pool<SigBit> &leaves, pool<pool<SigBit>> &cache, int maxdepth, int maxbreadth)
void find_partitions(SigBit root, pool<SigBit> &leaves, pool<pool<SigBit>> &cache, int maxdepth, int maxbreadth, IdString cell_type)
{
if (cache.count(leaves))
return;
@ -248,7 +249,7 @@ struct ExtractFaWorker
// log("\n");
cache.insert(leaves);
check_partition(root, leaves);
check_partition(root, leaves, cell_type);
if (maxdepth == 0)
return;
@ -270,7 +271,7 @@ struct ExtractFaWorker
if (GetSize(new_leaves) > maxbreadth)
continue;
find_partitions(root, new_leaves, cache, maxdepth-1, maxbreadth);
find_partitions(root, new_leaves, cache, maxdepth-1, maxbreadth, cell_type);
}
}
@ -302,7 +303,7 @@ struct ExtractFaWorker
count_func2 = 0;
count_func3 = 0;
find_partitions(root, leaves, cache, config.maxdepth, config.maxbreadth);
find_partitions(root, leaves, cache, config.maxdepth, config.maxbreadth, it.second->type);
if (config.verbose && count_func2 > 0)
log(" extracted %d two-input functions\n", count_func2);