public static AclLineMatchExprWithProvenance<IpAccessListLineIndex> explainWithProvenance(
BDDPacket bddPacket,
BDDSourceManager mgr,
AclLineMatchExpr invariantExpr,
IpAccessList acl,
Map<String, IpAccessList> namedAcls,
Map<String, IpSpace> namedIpSpaces) {
checkArgument(
namedAcls.getOrDefault(acl.getName(), acl).equals(acl),
"namedAcls contains a different ACL with the same name as acl");
IpAccessListToBDD ipAccessListToBDD =
MemoizedIpAccessListToBDD.create(bddPacket, mgr, namedAcls, namedIpSpaces);
Map<String, IpAccessList> finalNamedAcls = new TreeMap<>(namedAcls);
finalNamedAcls.putIfAbsent(acl.getName(), acl);
IpAccessList aclWithInvariant = scopedAcl(invariantExpr, acl);
IdentityHashMap<AclLineMatchExpr, IpAccessListLineIndex> literalsToLines =
AclLineMatchExprLiterals.literalsToLines(finalNamedAcls.values());
literalsToLines.putAll(AclLineMatchExprLiterals.literalsToLines(aclWithInvariant));
return explainWithProvenance(
ipAccessListToBDD, aclWithInvariant, ImmutableMap.copyOf(finalNamedAcls), literalsToLines);
}