/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: JtagTester.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; /** * Device-independent control of a single port on a JTAG tester. Provides * configuration, shifting data, etc. Also provides independent control of * multiple logic output levels. Constructor should connect to the JTAG * tester. */ public abstract class JtagTester extends Logger { public boolean printInfo = true; /** State of the logic output pins */ protected LogicSettableArray logicOutput; private boolean scannedOutDataIsInverted = false; /** * 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. * <p> * Test programs should use {@link ChainControl#setJtagKhz(int)} and * {@link ChainControl#setJtagVolts(float)} instead of calling this * routine directly. * * @param tapVolt * signal (TAP) voltage in Volts * @param kiloHerz * the TCK frequency in kHz (from 391 kHz to 40 MHz) */ abstract void configure(float tapVolt, long 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 abstract void 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 abstract void tms_reset(); /** * Disconnect from the JTAG tester. Should be called before exiting JVM. */ abstract void 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 */ abstract void shift(ChainNode chain, boolean readEnable, boolean writeEnable, int irBadSeverity); /** * Set the logic level for a single channel of the parallel programmable * output signals from the JTAG tester to the chip. * * @param index * Which parallel output to set * @param newLevel * set parallel output <tt>HI</tt>? */ abstract void setLogicOutput(int index, boolean newLevel); /** * Returns the logic state of the specified parallel output * * @param index * Which parallel output to query * * @return state of specified parallel output */ boolean getOutputState(int index) { return logicOutput.isLogicStateHigh(index); } /** * Tells that jtag controller that the scanned out data * it receives is inverted, so it must uninvert them. * * @param outputInverted * if the output is inverted */ public void setScanOutInverted(boolean outputInverted) { scannedOutDataIsInverted = outputInverted; } /** * Check that to see whether the scanned out data expected * to be inverted. * * @return if the data scanned out is inverted */ public boolean isScanOutInverted() { return scannedOutDataIsInverted; } }