📄 simulation.java
字号:
{ // if the window already exists, update the data if (ww != null) { ww.setSimData(sd); return; } Iterator<Analysis> anIt = sd.getAnalyses(); if (!anIt.hasNext()) { System.out.println("ERROR: No simulation data found: waveform window not shown"); return; } Analysis an = anIt.next(); // create a waveform window WindowFrame wf = WindowFrame.createWaveformWindow(sd); ww = (WaveformWindow)wf.getContent(); // if the data has an associated cell, see if that cell remembers the signals that were in the waveform window if (sd.getCell() != null) { String [] signalNames = WaveformWindow.getSignalOrder(sd.getCell()); boolean showedSomething = false; boolean wantUnlockedTime = false; Analysis.AnalysisType onlyType = null; for(int i=0; i<signalNames.length; i++) { String signalName = signalNames[i]; Signal xAxisSignal = null; if (signalName.startsWith("\t")) { // has panel type and X axis information int openPos = signalName.indexOf('('); int tabPos = signalName.indexOf('\t', 1); if (openPos >= 0) tabPos = openPos; String analysisName = signalName.substring(1, tabPos); Analysis.AnalysisType analysisType = Analysis.AnalysisType.findAnalysisType(analysisName); if (analysisType == null) continue; an = sd.findAnalysis(analysisType); if (an == null) continue; if (openPos >= 0) { int closePos = signalName.indexOf(')'); String sigName = signalName.substring(openPos+1, closePos); xAxisSignal = an.findSignalForNetwork(sigName); wantUnlockedTime = true; } } if (onlyType == null) onlyType = an.getAnalysisType(); if (an.getAnalysisType() != onlyType) wantUnlockedTime = true; Panel wp = null; boolean firstSignal = true; // add signals to the panel int start = 0; for(;;) { int tabPos = signalName.indexOf('\t', start); String sigName = null; if (tabPos < 0) sigName = signalName.substring(start); else { sigName = signalName.substring(start, tabPos); start = tabPos+1; } Signal sSig = an.findSignalForNetwork(sigName); if (sSig != null) { if (firstSignal) { firstSignal = false; wp = new Panel(ww, sd.isAnalog(), an.getAnalysisType()); if (xAxisSignal != null) wp.setXAxisSignal(xAxisSignal); wp.makeSelectedPanel(-1, -1); showedSomething = true; } new WaveSignal(wp, sSig); } if (tabPos < 0) break; } } if (showedSomething) { if (wantUnlockedTime) { ww.togglePanelXAxisLock(); for(Iterator<Panel> it = ww.getPanels(); it.hasNext(); ) { Panel panel = it.next(); panel.makeSelectedPanel(-1, -1); ww.fillScreen(); } } else { ww.fillScreen(); } return; } } if (an == null) // wrong format? { System.out.println("ERROR: No simulation data found: waveform window not shown"); return; } // nothing saved, so show a default set of signals (if it even exists) if (sd.isAnalog()) { Panel wp = new Panel(ww, sd.isAnalog(), an.getAnalysisType()); Rectangle2D bounds = an.getBounds(); double lowValue = bounds.getMinY(); double highValue = bounds.getMaxY(); wp.setYAxisRange(lowValue, highValue); wp.makeSelectedPanel(-1, -1); } else { // put all top-level signals in, up to a limit int numSignals = 0; List<Signal> allSignals = an.getSignals(); makeBussedSignals((DigitalAnalysis)an); for(int i=0; i<allSignals.size(); i++) { DigitalSignal sDSig = (DigitalSignal)allSignals.get(i); if (sDSig.getSignalContext() != null) continue; if (sDSig.isInBus()) continue; if (sDSig.getSignalName().indexOf('@') >= 0) continue; Panel wp = new Panel(ww, sd.isAnalog(), an.getAnalysisType()); wp.makeSelectedPanel(-1, -1); new WaveSignal(wp, sDSig); numSignals++; if (numSignals > 15) break; } } ww.getPanel().validate(); ww.fillScreen(); } private static void makeBussedSignals(DigitalAnalysis an) { List<DigitalSignal> signals = an.getSignals(); for(int i=0; i<signals.size(); i++) { Signal sSig = signals.get(i); int thisBracketPos = sSig.getSignalName().indexOf('['); if (thisBracketPos < 0) continue; String prefix = sSig.getSignalName().substring(0, thisBracketPos); // see how many of the following signals are part of the bus int j = i+1; for( ; j<signals.size(); j++) { Signal nextSig = signals.get(j); // other signal must have the same root int nextBracketPos = nextSig.getSignalName().indexOf('['); if (nextBracketPos < 0) break; if (thisBracketPos != nextBracketPos) break; if (!prefix.equals(nextSig.getSignalName().substring(0, nextBracketPos))) break; // other signal must have the same context if (sSig.getSignalContext() == null ^ nextSig.getSignalContext() == null) break; if (sSig.getSignalContext() != null) { if (!sSig.getSignalContext().equals(nextSig.getSignalContext())) break; } } // see how many signals are part of the bus int numSignals = j - i; if (numSignals <= 1) continue; // found a bus of signals: create the bus for it DigitalSignal busSig = new DigitalSignal(an); busSig.setSignalName(prefix, sSig.getSignalContext()); busSig.buildBussedSignalList(); for(int k=i; k<j; k++) { DigitalSignal subSig = signals.get(k); busSig.addToBussedSignalList(subSig); } i = j - 1; } } /** * Class to handle the "Clock specification" dialog. */ private static class ClockSpec extends EDialog { private double period = -1; private JRadioButton freqBut, periodBut; private JTextField freqField, periodField; public static double getClockSpec() { ClockSpec dialog = new ClockSpec(TopLevel.getCurrentJFrame(), true); dialog.setVisible(true); return dialog.period; } /** Creates new form Clock specification */ public ClockSpec(Frame parent, boolean modal) { super(parent, modal); getContentPane().setLayout(new GridBagLayout()); setTitle("Clock Specification"); setName(""); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { closeDialog(evt); } }); ButtonGroup fp = new ButtonGroup(); // the frequency and period section freqBut = new JRadioButton("Frequency:"); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.insets = new Insets(4, 4, 4, 4); gbc.anchor = GridBagConstraints.WEST; getContentPane().add(freqBut, gbc); fp.add(freqBut); freqField = new JTextField(); freqField.setColumns(12); gbc = new GridBagConstraints(); gbc.gridx = 1; gbc.gridy = 0; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.insets = new Insets(4, 4, 4, 4); getContentPane().add(freqField, gbc); periodBut = new JRadioButton("Period:"); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 1; gbc.insets = new Insets(4, 4, 4, 4); gbc.anchor = GridBagConstraints.WEST; getContentPane().add(periodBut, gbc); fp.add(periodBut); periodBut.setSelected(true); periodField = new JTextField(); periodField.setColumns(12); periodField.setText("0.00000001"); gbc = new GridBagConstraints(); gbc.gridx = 1; gbc.gridy = 1; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.insets = new Insets(4, 4, 4, 4); getContentPane().add(periodField, gbc); // the OK and Cancel buttons JButton cancel = new JButton("Cancel"); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { cancel(evt); } }); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 2; gbc.insets = new Insets(4, 4, 4, 4); getContentPane().add(cancel, gbc); JButton ok = new JButton("OK"); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { ok(evt); } }); gbc = new GridBagConstraints(); gbc.gridx = 1; gbc.gridy = 2; gbc.insets = new Insets(4, 4, 4, 4); getContentPane().add(ok, gbc); pack(); getRootPane().setDefaultButton(ok); finishInitialization(); } protected void escapePressed() { cancel(null); } private void cancel(ActionEvent evt) { closeDialog(null); } private void ok(ActionEvent evt) { if (freqBut.isSelected()) { double freq = TextUtils.atof(freqField.getText()); if (freq != 0) period = 1.0 / freq; } else { period = TextUtils.atof(periodField.getText()); } closeDialog(null); } /** Closes the dialog */ private void closeDialog(WindowEvent evt) { setVisible(false); dispose(); } } @Override protected void initProjectSettings() { initVerilogProjectSettings(); } /****************************** FAST HENRY OPTIONS ******************************/ private static Pref cacheFastHenryUseSingleFrequency = Pref.makeBooleanPref("FastHenryUseSingleFrequency", tool.prefs, false); /** * Method to tell whether FastHenry deck generation should use a single frequency. * The default is false. * @return true if FastHenry deck generation should use a single frequency. */ public static boolean isFastHenryUseSingleFrequency() { return cacheFastHenryUseSingleFrequency.getBoolean(); } /** * Method to set whether FastHenry deck generation should use a single frequency. * @param s true if FastHenry deck generation should use a single frequency. */ public static void setFastHenryUseSingleFrequency(boolean s) { cacheFastHenryUseSingleFrequency.setBoolean(s); } /** * Method to tell whether FastHenry deck generation should use a single frequency, by default. * @return true if FastHenry deck generation should use a single frequency, by default. */ public static boolean isFactoryFastHenryUseSingleFrequency() { return cacheFastHenryUseSingleFrequency.getBooleanFactoryValue(); } private static Pref cacheFastHenryStartFrequency = Pref.makeDoublePref("FastHenryStartFrequency", tool.prefs, 0); /** * Method to return the FastHenry starting frequency (or only if using a single frequency). * The default is 0. * @return the FastHenry starting frequency (or only if using a single frequency). */ public static double getFastHenryStartFrequency() { return cacheFastHenryStartFrequency.getDouble(); } /** * Method to set the FastHenry starting frequency (or only if using a single frequency).
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -