/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: RawFile.java
*
* Copyright (c) 2004, 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 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.interval;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Locale;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
/**
* Class for writing Spice ".raw" files.
* Raw data consists of points in vector space.
* Components of vector have name and type.
*/
public class RawFile {
private int numVars;
private int numPoints;
private double[][] data;
private String[] varName;
private String[] varType;
/**
* Constructs RawFile object.
* @param numPoints number of points.
* @param numVars dimension of vectors..
*/
public RawFile(int numPoints, int numVars) {
this.numVars = numVars;
this.numPoints = numPoints;
varName = new String[numVars];
varType = new String[numVars];
data = new double[numPoints][];
for (int i = 0; i < numPoints; i++)
data[i] = new double[numVars];
}
/**
* Defines name and type of component of vector.
* @param iVar index of component of vector.
* @param varName name of component of vector..
* @param varType type of component of vector..
*/
public void setVar(int iVar, String varName, String varType) {
this.varName[iVar] = varName;
this.varType[iVar] = varType;
}
/**
* Sets value of component of point.
* @param iPoint index of point.
* @param iVar index of component of vector.
* @param v value of component of point.
*/
public void set(int iPoint, int iVar, double v) {
data[iPoint][iVar] = v;
}
/**
* Writes RawFile data to file in ascii format.
* Ascii format is portable across platforms with different byte order.
* @param fileName name of file.
*/
public void write(String fileName) {
write(fileName, false, null);
}
/**
* Writes RawFile data to file either in binary format.
* Binary format is more compact and faster than ascii, but
* it is not portable across platforms with different byte order.
* @param fileName name of file.
* @param byteOrder byte order, if null then native bute order of the underlying platform.
*/
public void writeBinary(String fileName, ByteOrder byteOrder) {
write(fileName, true, byteOrder);
}
/**
* Writes RawFile data to file either in binary format or in ascii format.
* Ascii format is portable across platforms with different byte order.
* Binary format is faster.
* @param fileName name of file.
* @param binaryFormat if true write in binary format else write in ascii format.
* @param byteOrder byte order, if null then native bute order of the underlying platform.
*/
private void write(String fileName, boolean binaryFormat, ByteOrder byteOrder) {
try {
DecimalFormat fmt = new DecimalFormat("0.000000000000000000E00");
fmt.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));
FileOutputStream outStream = new FileOutputStream(fileName);
PrintWriter FILE = new PrintWriter(outStream);
FILE.println("Title: " + fileName);
FILE.println("Plotname: Waveform");
FILE.println("Flags: real");
FILE.println("No. Variables: " + numVars);
FILE.println("No. Points: " + numPoints);
FILE.println("Variables:");
for (int iVar = 0; iVar < numVars; iVar++) {
FILE.println("\t" + iVar + "\t" + varName[iVar] + "\t" + varType[iVar]);
}
if (binaryFormat) {
FILE.println("Binary:");
FILE.flush();
byte[] bytes = new byte[numVars*8];
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
byteBuffer.order(byteOrder != null ? byteOrder : ByteOrder.nativeOrder());
for (int iPoint = 0; iPoint < numPoints; iPoint++) {
byteBuffer.clear();
for (int iVar = 0; iVar < numVars; iVar++)
byteBuffer.putDouble(data[iPoint][iVar]);
outStream.write(bytes);
}
} else {
FILE.println("Values:");
for (int iPoint = 0; iPoint < numPoints; iPoint++) {
FILE.println(iPoint + "\t" + fmt.format(data[iPoint][0]));
for (int iVar = 1; iVar < numVars; iVar++) {
FILE.println("\t" + fmt.format(data[iPoint][iVar]));
}
FILE.println();
}
}
FILE.close();
}
catch (FileNotFoundException e) {
System.out.println("Failure writing file " + fileName);
}
catch (IOException e) {
System.out.println("Failure writing file " + fileName);
}
}
}