/* -*- tab-width: 4 -*-
 *
 * Electric(tm) VLSI Design System
 *
 * File: Equivalence.java
 *
 * Copyright (c) 2005, 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 this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.sun.electric.tool.ncc.result.equivalence;

import java.io.Serializable;

import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.database.hierarchy.Nodable;
import com.sun.electric.database.hierarchy.HierarchyEnumerator.NetNameProxy;
import com.sun.electric.database.hierarchy.HierarchyEnumerator.NodableNameProxy;
import com.sun.electric.database.network.Network;
import com.sun.electric.database.variable.VarContext;

/** Save the equivalence information produced by NCC so 
 * that a tool can map a Part or Wire in the schematic 
 * to the equivalent Part or Wire in the layout.
 */
public class Equivalence implements Serializable {
    static final long serialVersionUID = 0;

	private final NetEquivalence netEquiv;
	private final NodeEquivalence nodeEquiv;
	
	private void prln(String s) {System.out.println(s);}
    
	public Equivalence(NetNameProxy[][] equivNets,
			           NodableNameProxy[][] equivNodes,
			           Cell[] nccRootCells, 
			           VarContext[] nccRootCtxts) {
		netEquiv = new NetEquivalence(equivNets, nccRootCells, nccRootCtxts);
		nodeEquiv = new NodeEquivalence(equivNodes);
	}
	/** Given a Network in one design, return the matching network
	 * in the other design. 
	 * @param vc the VarContext specifying the instance path of the network
	 * @param net the network in one design
	 * @return the matching network in the other design
	 */
	public NetNameProxy findEquivalentNet(VarContext vc, Network net) {
		return netEquiv.findEquivalentNet(vc, net);
	}
	/** Given a Network in one design, return the matching network
	 * in the other design. Treat resistors as short circuits. 
	 * @param vc the VarContext specifying the instance path of the network
	 * @param net the network in one design
	 * @return the matching network in the other design
	 */
	public NetNameProxy findEquivalentNetShortingResistors(VarContext vc, Network net) {
		return netEquiv.findEquivalentNetShortingResistors(vc, net);
	}
	/** Given a Nodable in one design, return the matching Nodable
	 * in the other design. 
	 * @param vc the VarContext specifying the instance path of the Nodable
	 * @param node the Nodable in one design
	 * @return the matching Nodable in the other design
	 */
	public NodableNameProxy findEquivalentNode(VarContext vc, Nodable node) {
		return nodeEquiv.findEquivalent(vc, node);
	}
	/** Perform a sanity check of the equivalence tables. This method
	 * is used by the NCC regressions.
	 * @param cell0 first Cell. this is used for the status message
	 * @param cell1 second Cell. this is used for the status message
	 */
	public int regressionTest(Cell cell0, Cell cell1) {
		prln("  Equivalence regression for: "+cell0.describe(false)+
			 " and "+cell1.describe(false));
		int numErrors = netEquiv.regressionTest() +
			            nodeEquiv.regressionTest();
		clearCache();
		return numErrors;
	}
	/** To reduce storage requirements, release cached information when you
	 * are done using this Equivalence table. */
	public void clearCache() {
		netEquiv.clearCache();
		nodeEquiv.clearCache();
	}
}
