/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: MockJtag.java * Written by Tom O'Neill, Sun Microsystems. * * Copyright (c) 2004 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; /** * Mock up of the control of a {@link Netscan} JTAG tester, allows * simulated execution of test software even in the absence of a chip. Provides * configuration, shifting data, etc. */ public class MockJtag extends JtagTester { /** Number of GPIO pins on the tester */ public static final int NUM_OUTPUT_PINS = 3; /** State of the parallel outputs */ private LogicSettableArray logicOutput; public MockJtag() { logicOutput = new LogicSettableArray(NUM_OUTPUT_PINS); setParallelIO(logicOutput.getLogicStates()); } /** * Configures the JTAG tester, setting its parameters, and resets the JTAG * controller (clears TRST* briefly). Can be run at any time after * initialization to change settings. * * @param tapVolt * signal (TAP) voltage in Volts * @param kiloHerz * the TCK frequency in kHz (from 391 kHz to 40 MHz) */ void configure(float tapVolt, long kiloHerz) { logSet("MockJTAG configure: set tapVolt=" + tapVolt + ", kiloHerz=" + kiloHerz); } /** * Reset the finite state machine of the chip's JTAG controller by briefly * setting the TRST signal <tt>LO</tt>. The IR becomes bypass * automatically. */ public void reset() { logSet("MockJTAG reset()"); } /** * Reset the finite state machine of the chip's JTAG controller by briefly * setting the TMS signal <tt>HI</tt> for 5 cycles. The IR becomes bypass * automatically. */ public void tms_reset() { logSet("MockJTAG reset()"); } /** * Disconnect from the JTAG tester. Should be called before exiting JVM. */ void disconnect() { logSet("MockJTAG disconnect()"); } /** * Shift data in chain.inBits into the selected scan chain on the chip. The * previous data on the chip is shifted out into chain.outBits. Should only * be called by ChainNode. * * @param chain * Root scan chain to shift data into * @param readEnable * whether to set opcode's read-enable bit * @param writeEnable * whether to set opcode's write-enable bit * @param irBadSeverity * action when bits scanned out of IR are wrong * @see ChainNode * @see Infrastructure#SEVERITY_NOMESSAGE * @see Infrastructure#SEVERITY_WARNING * @see Infrastructure#SEVERITY_NONFATAL * @see Infrastructure#SEVERITY_FATAL */ void shift(ChainNode chain, boolean readEnable, boolean writeEnable, int irBadSeverity) { logOther("MockJTAG shift: opcode=" + chain.getOpcode() + "\n " + chain.getInBits()); int length = chain.getLength(); BitVector outBits = new BitVector(length, "MockJtag.shift().outBits"); BitVector outBitsExpected = chain.getOutBitsExpected(); for (int ibit = 0; ibit < length; ibit++) { if (outBitsExpected.isValid(ibit) == true) { /* need to handle shadowState carefully - for scanBB */ if (!writeEnable) { outBits.set(ibit, outBitsExpected.get(ibit)); } else { outBits.putIndiscriminate(ibit, chain.getShadowState().getIndiscriminate(ibit,1)); } } else { outBits.clear(ibit); } } chain.getOutBits().putIndiscriminate(0, outBits); } /** * Set the logic levels for the parallel programmable output signals from * the JTAG tester to the chip. * * @param newLevel * set parallel outputs 0, 1 <tt>HI</tt>? */ private void setParallelIO(boolean[] newLevel) { String msg = "Parallel output state now:"; for (int ind = 0; ind < newLevel.length; ind++) { msg += " " + newLevel[ind]; } System.out.println(msg); } /** * Set the logic level for a single channel of the parallel programmable * output signals from the JTAG tester to the chip. Updates * {@link #logicOutput}. * * @param index * Which parallel output to set * @param newLevel * set parallel output <tt>HI</tt>? */ void setLogicOutput(int index, boolean newLevel) { logicOutput.setLogicState(index, newLevel); setParallelIO(logicOutput.getLogicStates()); } }