@Override
  public void generateTraceGraph(final GraphEditor editor) {
    Framework framework = Framework.getInstance();
    Stg stg = getUnderlyingStg();
    Trace trace = getCombinedTrace();
    if (trace.isEmpty()) {
      JOptionPane.showMessageDialog(
          framework.getMainWindow(),
          "Cannot generate a timing diagram for an empty trace.",
          "Generation of Timing Diagram",
          JOptionPane.WARNING_MESSAGE);
    } else {
      LinkedList<Pair<String, Color>> orderedTraceSignals = getOrderedTraceSignals(stg, trace);
      StgToDtdConverter converter = new StgToDtdConverter(stg, trace, orderedTraceSignals);
      VisualDtd dtd = converter.getVisualDtd();

      WorkspaceEntry we = editor.getWorkspaceEntry();
      final Path<String> directory = we.getWorkspacePath().getParent();
      final String desiredName = we.getWorkspacePath().getNode();
      final ModelEntry me = new ModelEntry(new DtdDescriptor(), dtd);
      final Workspace workspace = framework.getWorkspace();
      workspace.add(directory, desiredName, me, true, true);
    }
  }
  private void handleSynthesisResult(
      ExternalProcessResult mpsatResult, boolean sequentialAssign, RenderType renderType) {
    final String log = new String(mpsatResult.getOutput());
    if ((log != null) && !log.isEmpty()) {
      System.out.println(log);
      System.out.println();
    }
    byte[] eqnOutput = mpsatResult.getFileData(MpsatSynthesisTask.EQN_FILE_NAME);
    if (eqnOutput != null) {
      LogUtils.logInfoLine("MPSat synthesis result in EQN format:");
      System.out.println(new String(eqnOutput));
      System.out.println();
    }
    byte[] verilogOutput = mpsatResult.getFileData(MpsatSynthesisTask.VERILOG_FILE_NAME);
    if (verilogOutput != null) {
      LogUtils.logInfoLine("MPSat synthesis result in Verilog format:");
      System.out.println(new String(verilogOutput));
      System.out.println();
    }
    if (MpsatSynthesisUtilitySettings.getOpenSynthesisResult() && (verilogOutput != null)) {
      try {
        ByteArrayInputStream in = new ByteArrayInputStream(verilogOutput);
        VerilogImporter verilogImporter = new VerilogImporter(sequentialAssign);
        final Circuit circuit = verilogImporter.importCircuit(in);
        final WorkspaceEntry we = task.getWorkspaceEntry();
        Path<String> path = we.getWorkspacePath();
        final Path<String> directory = path.getParent();
        final String name = FileUtils.getFileNameWithoutExtension(new File(path.getNode()));
        final ModelEntry me = new ModelEntry(new CircuitDescriptor(), circuit);
        boolean openInEditor = me.isVisual() || CommonEditorSettings.getOpenNonvisual();

        final Framework framework = Framework.getInstance();
        final Workspace workspace = framework.getWorkspace();
        WorkspaceEntry newWorkspaceEntry = workspace.add(directory, name, me, true, openInEditor);
        VisualModel visualModel = newWorkspaceEntry.getModelEntry().getVisualModel();
        if (visualModel instanceof VisualCircuit) {
          VisualCircuit visualCircuit = (VisualCircuit) visualModel;
          for (VisualFunctionComponent component : visualCircuit.getVisualFunctionComponents()) {
            component.setRenderType(renderType);
          }
          String title = we.getModelEntry().getModel().getTitle();
          visualCircuit.setTitle(title);
          if (!we.getFile().exists()) {
            JOptionPane.showMessageDialog(
                null,
                "Error: Unsaved STG cannot be set as the circuit environment.",
                TITLE,
                JOptionPane.ERROR_MESSAGE);
          } else {
            visualCircuit.setEnvironmentFile(we.getFile());
            if (we.isChanged()) {
              JOptionPane.showMessageDialog(
                  null,
                  "Warning: The STG with unsaved changes is set as the circuit environment.",
                  TITLE,
                  JOptionPane.WARNING_MESSAGE);
            }
          }
          SwingUtilities.invokeLater(
              new Runnable() {
                @Override
                public void run() {
                  framework.getMainWindow().getCurrentEditor().updatePropertyView();
                }
              });
        }
      } catch (DeserialisationException e) {
        throw new RuntimeException(e);
      }
    }
  }