/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: ArchSimOut.java
* Input/output tool: reader for ArchSim output (.asj)
* Written by Steven M. Rubin, 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.io.input;
import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.database.text.TextUtils;
import com.sun.electric.tool.simulation.DigitalAnalysis;
import com.sun.electric.tool.simulation.DigitalSignal;
import com.sun.electric.tool.simulation.Stimuli;
import java.awt.Point;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Class for reading and displaying waveforms from ArchSim output.
* These are contained in .asj files.
*/
public class ArchSimOut extends Simulate
{
/**
* Method to read an ArchSim output file.
*/
protected void readSimulationOutput(Stimuli sd, URL fileURL, Cell cell)
throws IOException
{
// open the file
if (openTextInput(fileURL)) return;
// show progress reading .dump file
startProgressDialog("ArchSim output", fileURL.getFile());
// read the actual signal data from the .dump file
readArchSimFile(cell, sd);
// stop progress dialog, close the file
stopProgressDialog();
closeInput();
}
private void readArchSimFile(Cell cell, Stimuli sd)
throws IOException
{
// read all of the stimuli
Map<String,List<Point>> symbolTable = new HashMap<String,List<Point>>();
int greatestTime = 0;
for(;;)
{
String line = getLineFromSimulator();
if (line == null) break;
int firstColon = line.indexOf(':');
int secondColon = line.indexOf(':', firstColon+1);
if (firstColon < 0 || secondColon < 0)
{
System.out.println("Line " + lineReader.getLineNumber() + " is missing two colons: " + line);
continue;
}
int time = TextUtils.atoi(line.substring(0, firstColon));
if (time > greatestTime) greatestTime = time;
String signalName = line.substring(firstColon+1, secondColon);
int value = TextUtils.atoi(line.substring(secondColon+1));
List<Point> values = symbolTable.get(signalName);
if (values == null)
{
values = new ArrayList<Point>();
symbolTable.put(signalName, values);
}
values.add(new Point(time, value));
continue;
}
// make a data structure for it
DigitalAnalysis an = new DigitalAnalysis(sd, true);
sd.setCell(cell);
for(String signalName : symbolTable.keySet())
{
List<Point> values = symbolTable.get(signalName);
int numStimuli = values.size();
DigitalSignal sig = new DigitalSignal(an);
sig.setSignalName(signalName, null);
sig.buildTime(numStimuli);
sig.buildState(numStimuli);
int i = 0;
for(Point pt : values)
{
sig.setTime(i, pt.x);
int state = Stimuli.LOGIC_LOW | Stimuli.GATE_STRENGTH;
if (pt.y != 0) state = Stimuli.LOGIC_HIGH | Stimuli.GATE_STRENGTH;
sig.setState(i, state);
i++;
}
}
}
}