/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: ExportMismatch.java
*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
*
* 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.user.ncc;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.database.variable.VarContext;
import com.sun.electric.tool.ncc.result.NetObjReport;
import com.sun.electric.tool.ncc.result.PortReport;
import com.sun.electric.tool.ncc.result.NetObjReport.NetObjReportable;
import com.sun.electric.tool.ncc.result.PortReport.PortReportable;
/**
* This class is an abstract superclass for Export mismatches
*/
public abstract class ExportMismatch implements Serializable {
/** Cell names */ protected String desingNames[] = new String[2];
/** Compared Cells */ protected Cell[] cells = new Cell[2];
/** Conetexts */ protected VarContext[] contexts = new VarContext[2];
/** is this a topology mismatch? */ protected boolean topologyMatch;
/** is this a name mismatch? */ protected boolean nameMatch;
/** is this mismatch valid only when topology mismatch?
* Used to avoid duplication with suggested matches which are
* given when topology matches */
protected boolean validOnlyWhenTopologyMismatch;
public ExportMismatch() { init(); }
public ExportMismatch(String name1, String name2) {
desingNames[0] = name1;
desingNames[1] = name2;
init();
}
private void init() {
topologyMatch = true;
nameMatch = true;
validOnlyWhenTopologyMismatch = false;
}
/**
* Get Cell name
* @param index Cell index: 0 or 1
* @return Cell name for the given index or null if index is invalid
*/
public String getName(int index) {
if (index != 0 && index != 1) return null;
return desingNames[index];
}
/**
* Set names of the compared Cels (designs). Has no effect on the names
* stored in the Cells themselves.
* @param name1 new name for the first design
* @param name2 new name for the second design
*/
public void setNames(String name1, String name2) {
desingNames[0] = name1;
desingNames[1] = name2;
}
/**
* Get Cell with the given design index.
* @param index design index: 0 or 1
* @return Cell with the given index or null if index is invalid
*/
public Cell getCell(int index) {
if (index != 0 && index != 1) return null;
return cells[index];
}
/**
* Set compared Cells (designs).
* @param cell1 new first design Cell
* @param cell2 new second design Cell
*/
public void setCells(Cell cell1, Cell cell2) {
cells[0] = cell1;
cells[1] = cell2;
}
/**
* Get Context with the given design index.
* @param index design index: 0 or 1
* @return Context with the given index or null if index is invalid
*/
public VarContext getContext(int index) {
if (index != 0 && index != 1) return null;
return contexts[index];
}
/**
* Set Contexts of the compared Cells (designs).
* @param cnxt1 new Context for the first Cell
* @param cnxt2 new Context for the second Cell
*/
public void setContexts(VarContext cnxt1, VarContext cnxt2) {
contexts[0] = cnxt1;
contexts[1] = cnxt2;
}
public boolean isTopologyMatch() { return topologyMatch; }
public void setTopologyMatch(boolean topologyMatch) {
this.topologyMatch = topologyMatch;
}
public boolean isNameMatch() { return nameMatch; }
public void setNameMatch(boolean nameMatch) {
this.nameMatch = nameMatch;
}
public boolean isValidOnlyWhenTopologyMismatch() {
return validOnlyWhenTopologyMismatch;
}
public void setValidOnlyWhenTopologyMismatch(boolean valid) {
validOnlyWhenTopologyMismatch = valid;
}
/**
* This class implements a zero-to-one, zero-to-many, one-to-many, and
* many-to-many Export mismatch.
*/
public static class MultiMatch extends ExportMismatch{
static final long serialVersionUID = 0;
/** Lists of mismatched exports in each Cells.
* The stored objects are Ports on which mismatched Exports are */
private final List<PortReport> ports[] = new List[2];
public MultiMatch() {
ports[0] = new ArrayList<PortReport>();
ports[1] = new ArrayList<PortReport>();
}
/**
* Add a mismatched Port.
* @param listIndex Cell index
* @param port Port to add
*/
public void add(int listIndex, PortReportable port) {
ports[listIndex].add(new PortReport(port));
}
/**
* Add all mismatched Ports in the proviede set
* @param listIndex Cell index
* @param portSet Ports to add
*/
public void add(int listIndex, Set<PortReportable> portSet) {
for (PortReportable p : portSet) ports[listIndex].add(new PortReport(p));
}
/**
* Get all Ports for a given Cell
* @param index Cell index
* @return the list with all Posrt for the Cell with the given index
*/
public List<PortReport> getAll(int index) {return ports[index];}
}
/**
* This class is a container for a suggested Export match.
*/
public static class NameMismatch extends ExportMismatch {
static final long serialVersionUID = 0;
/** Mismatched Export in the first design */ private PortReport exp1;
/** Suggested match in the second design */ private NetObjReport exp2;
// exp2 is Port or Wire
public NameMismatch() {
nameMatch = false;
topologyMatch = true;
}
public NameMismatch(String name1, String name2) {
desingNames[0] = name1;
desingNames[1] = name2;
nameMatch = false;
topologyMatch = true;
}
public PortReport getFirstExport() { return exp1; }
public NetObjReport getSuggestion() { return exp2; }
public void setFirstExport(PortReportable exp1) {
this.exp1 = new PortReport(exp1);
}
public void setSuggestion(NetObjReportable exp2) {
this.exp2 = NetObjReport.newNetObjReport(exp2);
}
}
/**
* This class is a container for a topological Export mismatch.
* It also might have a suggested Export match.
*/
public static class TopologyMismatch extends ExportMismatch{
static final long serialVersionUID = 0;
/** Mismatched Exports */ private PortReport exp1, exp2;
/** Suggestion in the 2nd design */ private NetObjReport sug = null;
// sug is Port or Wire
public TopologyMismatch() {
nameMatch = true;
topologyMatch = false;
}
public TopologyMismatch(String name1, String name2) {
desingNames[0] = name1;
desingNames[1] = name2;
nameMatch = true;
topologyMatch = false;
}
public PortReport getFirstExport() { return exp1; }
public PortReport getSecondExport() { return exp2; }
public NetObjReport getSuggestion() { return sug; }
public void setFirstExport(PortReportable exp1){
this.exp1 = new PortReport(exp1);
}
public void setSecondExport(PortReportable exp2) {
this.exp2 = new PortReport(exp2);
}
public void setSuggestion(NetObjReportable sug) {
this.sug = NetObjReport.newNetObjReport(sug);
}
}
}