/******************************************************************************* * See the NOTICE file distributed with this work for additional information * regarding copyright ownership. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package hr.fer.zemris.vhdllab.platform.ui.wizard.testbench; import hr.fer.zemris.vhdllab.applets.editor.newtb.enums.ChangeStateEdge; import hr.fer.zemris.vhdllab.applets.editor.newtb.enums.TimeScale; import hr.fer.zemris.vhdllab.applets.editor.newtb.enums.VectorDirection; import hr.fer.zemris.vhdllab.applets.editor.newtb.exceptions.UniformSignalException; import hr.fer.zemris.vhdllab.applets.editor.newtb.exceptions.UniformTestbenchException; import hr.fer.zemris.vhdllab.applets.editor.newtb.model.CombinatorialTestbench; import hr.fer.zemris.vhdllab.applets.editor.newtb.model.SingleClockTestbench; import hr.fer.zemris.vhdllab.applets.editor.newtb.model.Testbench; import hr.fer.zemris.vhdllab.applets.editor.newtb.model.signals.EditableSignal; import hr.fer.zemris.vhdllab.applets.editor.newtb.model.signals.ScalarSignal; import hr.fer.zemris.vhdllab.applets.editor.newtb.model.signals.Signal; import hr.fer.zemris.vhdllab.applets.editor.newtb.model.signals.VectorSignal; import hr.fer.zemris.vhdllab.applets.editor.newtb.view.InitTimingDialog; import hr.fer.zemris.vhdllab.entity.File; import hr.fer.zemris.vhdllab.entity.FileType; import hr.fer.zemris.vhdllab.platform.ui.wizard.AbstractNewFileWizard; import hr.fer.zemris.vhdllab.service.MetadataExtractionService; import hr.fer.zemris.vhdllab.service.ci.CircuitInterface; import hr.fer.zemris.vhdllab.service.ci.Port; import javax.swing.JOptionPane; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.richclient.form.Form; public class NewTestbenchWizard extends AbstractNewFileWizard { @Autowired private MetadataExtractionService metadataExtractionService; protected Form testbenchFileForm; @Override public void addPages() { testbenchFileForm = new TestbenchFileForm(); addForm(testbenchFileForm); } @Override protected File getFile() { TestbenchFile testbenchFile = (TestbenchFile) testbenchFileForm .getFormObject(); File file = new File(); file.setName(testbenchFile.getTestbenchName()); file.setProject(testbenchFile.getTargetFile().getProject()); return file; } @Override protected FileType getFileType() { return FileType.TESTBENCH; } @Override protected String createData() { TestbenchFile testbenchFile = (TestbenchFile) testbenchFileForm .getFormObject(); String string = oldCode(testbenchFile.getTestbenchName(), testbenchFile .getTargetFile()); if (string == null) { performCancel(); throw new IllegalStateException("Dialog canceled"); } return string; } private String oldCode(String testbench, File targetFile) { java.awt.Component parent = null; CircuitInterface ci = metadataExtractionService .extractCircuitInterface(targetFile.getId()); while (true) { InitTimingDialog initTimingDialog = new InitTimingDialog(parent, true, ci, testbench, targetFile.getProject().getName()); initTimingDialog.startDialog(); if (initTimingDialog.getOption() != InitTimingDialog.OK_OPTION) return null; Testbench tb = null; try { tb = this.getInitialTestbench(initTimingDialog, targetFile .getName()); this.addSignals(tb, ci); return tb.toXml(); } catch (UniformTestbenchException ex) { JOptionPane.showMessageDialog(null, ex.getMessage(), "Error creating testbench", JOptionPane.ERROR_MESSAGE); continue; } catch (Exception ex) { ex.printStackTrace(); } } } private void addSignals(Testbench tb, CircuitInterface ci) { Signal s = null; for (Port p : ci.getPorts()) { try { if (p.isIN()) { if (p.isScalar()) { s = new ScalarSignal(p.getName()); } else { short d = (short) (1 + Math .abs(p.getFrom() - p.getTo())); s = new VectorSignal(p.getName(), d, VectorDirection .valueOf(p.getDirectionName().toLowerCase())); } } if (s != null) { tb.addSignal((EditableSignal) s); } } catch (UniformSignalException e) { e.printStackTrace(); } catch (UniformTestbenchException e) { e.printStackTrace(); } } } private Testbench getInitialTestbench(InitTimingDialog initTimingDialog, String sourceName) throws UniformTestbenchException { Testbench tb = null; TimeScale timeScale = TimeScale .valueOf(initTimingDialog.getTimeScale()); if (Math.log(TimeScale.getMultiplier(timeScale)) + Math.log(initTimingDialog.getInitialLengthOfTestbench()) >= Math .log(Long.MAX_VALUE)) { throw new UniformTestbenchException( "Testbench length is too large. Change the time scale."); } long testBenchLength = TimeScale.getMultiplier(timeScale) * initTimingDialog.getInitialLengthOfTestbench(); if (initTimingDialog.isCombinatorial()) { CombinatorialTestbench.Properties p = new CombinatorialTestbench.Properties(); p.assignInputsTime = TimeScale.getMultiplier(timeScale) * initTimingDialog.getAssignInputs(); p.checkOutputsTime = TimeScale.getMultiplier(timeScale) * initTimingDialog.getCheckOutputs(); tb = new CombinatorialTestbench(sourceName, testBenchLength, timeScale, p); } else { SingleClockTestbench.Properties p = new SingleClockTestbench.Properties(); if (initTimingDialog.isRisingEdgeSelected()) { p.changeStateEdge = ChangeStateEdge.rising; } else { p.changeStateEdge = ChangeStateEdge.falling; } p.clockSignalName = initTimingDialog.getClockSignal(); p.clockTimeHigh = TimeScale.getMultiplier(timeScale) * initTimingDialog.getClockTimeHigh(); p.clockTimeLow = TimeScale.getMultiplier(timeScale) * initTimingDialog.getClockTimeLow(); p.inputSetupTime = TimeScale.getMultiplier(timeScale) * initTimingDialog.getInputSetupTime(); tb = new SingleClockTestbench(sourceName, testBenchLength, timeScale, p); } return tb; } }