/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: EquivRecReport.java
*
* Copyright (c) 2003 Sun Microsystems and Static Free Software
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.tool.ncc.result;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.sun.electric.tool.ncc.result.NetObjReport.NetObjReportable;
import com.sun.electric.tool.Job;
/** EquivRecReport stores information needed by the
* NCC GUI in order to report mismatches to the user.
*/
public class EquivRecReport implements Serializable {
static final long serialVersionUID = 0;
public interface EquivRecReportable {
List<String> getPartitionReasonsFromRootToMe();
void getNetObjReportablesFromEntireTree(
List<List<NetObjReportable>> matched,
List<List<NetObjReportable>> notMatched);
}
// ------------------------------- data -----------------------------------
// A ResEquivRec is either due to a local partitioning mismatch
// or a hash code mismatch.
private final boolean hashMismatch;
// matched exists only for bad local partition records. matched
// holds those ResNetObjs belonging to bad local partition
// records that were matched by hash coding.
private final List<List<NetObjReport>> matched, notMatched;
private final List<String> reasons;
private List<NetObjReport> makeReports1(List<NetObjReportable> nor) {
List<NetObjReport> ans = new ArrayList<NetObjReport>();
for (NetObjReportable j : nor) {
ans.add(NetObjReport.newNetObjReport(j));
}
return ans;
}
private List<List<NetObjReport>> makeReports(List<List<NetObjReportable>> nors) {
List<List<NetObjReport>> ans = new ArrayList<List<NetObjReport>>();
for (List<NetObjReportable> i : nors) {
ans.add(makeReports1(i));
}
return ans;
}
public EquivRecReport(EquivRecReportable er, boolean hashMismatch) {
this.hashMismatch = hashMismatch;
reasons = er.getPartitionReasonsFromRootToMe();
List<List<NetObjReportable>> m = new ArrayList<List<NetObjReportable>>();
List<List<NetObjReportable>> nm = new ArrayList<List<NetObjReportable>>();
er.getNetObjReportablesFromEntireTree(m, nm);
matched = makeReports(m);
notMatched = makeReports(nm);
}
public EquivRecReport(boolean hashMismatch, boolean hasParts,
List<List<NetObjReport>> matched,
List<List<NetObjReport>> notMatched,
List<String> reasons) {
this.hashMismatch = hashMismatch;
this.matched = matched;
this.notMatched = notMatched;
this.reasons = reasons;
}
public int maxSize() {
return Math.max(matched.get(0).size() + notMatched.get(0).size(),
matched.get(1).size() + notMatched.get(1).size());
}
public boolean hashMismatch() {return hashMismatch;}
public List<String> getReasons() {return reasons;}
public boolean hasParts() {
for (List<NetObjReport> i : matched) {
for (NetObjReport j : i) {
return (j instanceof PartReport);
}
}
for (List<NetObjReport> i : notMatched) {
for (NetObjReport j : i) {
return (j instanceof PartReport);
}
}
Job.error(true, "EquivRecord with no NetObjects?");
return false;
}
/** Only bad local partition EquivRecords have matched net objects. */
public List<List<NetObjReport>> getMatchedNetObjs() {return matched;}
public List<List<NetObjReport>> getNotMatchedNetObjs() {return notMatched;}
}