/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: ChainControlFake.java
* Written by Jonathan Gainsley, Sun Microsystems.
*
* Copyright (c) 2005 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.simulation.test;
import org.w3c.dom.Element;
/**
* Create a fake Chain Control when no XML file is available.
*/
public class ChainControlFake extends ChainControl {
private ChipNode chipNode;
public ChainControlFake(String chipName, int lengthIR, JtagTester jtagTester,
float jtagVolts, int jtagKhz) {
super(null, jtagTester, jtagVolts, jtagKhz);
system = new TestNode("System", "System Top Level");
chipNode = new ChipNode(chipName, lengthIR, "Chip Top Level");
system.addChild(chipNode);
}
/**
* Add 1 or more scan chain bits to the specified chain. If the chain does not
* exists, it is created, and the specified bits are at the beginning of the chain.
* Subsequent calls using the same chain name will append the added bits to the end
* of the chain.
* @param chain the name of the chain
* @param scanElementName the name of the scan chain element
* @param length the number of bits in the element (it could by an arrayed instance)
* @param access the access of the element (see configureXML.bsh)
* @param clears the clears of the element (see configureXML.bsh)
* @param dataNet the name of the data network that the scan chain writes to, or null if none.
* Note that dataNet can no longer be an internal net to the scan chain element, so
* the scanElementName is not used in the hierarchical path to the spice net.
* @param dataNet2 the name of the data-bar network that the scan chain writes to, or null if none
* Note that dataNet can no longer be an internal net to the scan chain element, so
* the scanElementName is not used in the hierarchical path to the spice net.
*/
public void addScanBits(String chain, String scanElementName, int length, String access,
String clears, String dataNet, String dataNet2) {
TestNode chainNode = getChainNode(chain);
if (chainNode == null) {
// create new chain
chainNode = createTreeNodeChain(chain, "fakeChain", 0); // don't need opcode for FakeChainControl
if (chainNode == null) return;
chipNode.addChild(chainNode);
}
Element dummyXML = new javax.imageio.metadata.IIOMetadataNode("subchain");
dummyXML.setAttribute("name", scanElementName);
dummyXML.setAttribute("length", String.valueOf(length));
dummyXML.setAttribute("access", access);
dummyXML.setAttribute("clears", clears);
dummyXML.setAttribute("dataNet", dataNet);
dummyXML.setAttribute("dataNet2", dataNet2);
TestNode subchainNode;
try {
subchainNode = XMLIO.createTreeNode(dummyXML, chainNode);
} catch (Exception e) {
System.out.println("Exception trying to create ChainControlFake");
e.printStackTrace(System.out);
return;
}
if (subchainNode != null)
chainNode.addChild(subchainNode);
}
public boolean shift(String chainRoot, boolean readEnable,
boolean writeEnable, int irBadSeverity, int noTestSeverity,
int errTestSeverity) {
if (!(jtag instanceof BypassJtagTester)) {
System.out.println("Error! JtagTester must be a NanosimJtagTester or NanosimJtagSubchainTester to use a Fake ChainControl.");
return false;
}
if (!((BypassJtagTester)jtag).isBypassScanning()) {
System.out.println("Error! ChainControlFake can only be used in bypass scanning (direct read/write) mode. See NanosimModel.start()");
return false;
}
return super.shift(chainRoot, readEnable, writeEnable, irBadSeverity, noTestSeverity, errTestSeverity);
}
// ==================================================================================
// Create Fake Scan Chain Hierarchy
private TestNode createTreeNodeChain(String name, String opcode, int length) {
Element dummyXML = new javax.imageio.metadata.IIOMetadataNode("chain");
dummyXML.setAttribute("name", name);
dummyXML.setAttribute("opcode", opcode);
dummyXML.setAttribute("length", String.valueOf(length));
TestNode chainNode;
try {
chainNode = XMLIO.createTreeNode(dummyXML, chipNode);
} catch (Exception e) {
System.out.println("Exception trying to create ChainControlFake");
e.printStackTrace(System.out);
return null;
}
return chainNode;
}
/**
* Get the chainNode by name from the chipNode
* @param chainName the name of the chainNode
* @return the chainNode, or null if none found
*/
private TestNode getChainNode(String chainName) {
for (int i=0; i<chipNode.getChildCount(); i++) {
TestNode chainNode = (TestNode)chipNode.getChildAt(i);
if (chainNode.getName().equals(chainName))
return chainNode;
}
return null;
}
}