ModelSimのシミュレーション波形をWordとかにきれいに貼り付ける方法

# はじめに
ModelSimでシミュレーションした波形をWordやPower Pointに貼り付けて資料を作成することがあります。
高解像度で整った波形を使用し資料を作成できたため、この方法を共有します。

# 概要
ここでは、以下を試行します
- ModelSimからPostscript形式で波形を保存
  - 上記をtclコマンドで実行する
  - 上記をtclスクリプトで複数実行する
- pstoeditでPostscript形式からEMFファイルを生成
- GhostscriptでPostscript形式からPDFファイルを生成
  - 上記をコマンドプロンプトで実行する
  - 上記をシェルスクリプトで複数実行する

# 波形の取得方法
ModelSimからシミュレーション波形を取得する方法として、以下の方法が考えられます。

1. [Alt]+[Print Screen]でウィンドウのスクリーンショットを取得し貼り付け
1. [Win]+[Shift]+[s]で該当する部分を切り抜きスクリーンショットを取得し貼り付け
1. 「File」－「Export」－「Image...」で保存する
1. 「File」－「Export」－「vcd...」で保存する
1. 「File」－「Print」で仮想PDFプリンタあてに印刷する
1. 「File」－「Print Postscript」でポストスクリプトファイル（.ps）を保存する

1、2の方法は、取得する画像は画面の解像度なので、そのまま貼り付けるには荒くなりますし、波形の範囲も画面のサイズに限られてしまいます。
3は実行したところ、どのファイル形式を選んでも「image file format "bmp" is unknown」と出て進みません。
4はvcdファイルをさらに画像にする必要があります。
5はPDFファイルが出来上がりますので、それを解像度指定で画像取得すれば、高解像度でWordに貼り付けられます。

# PDFスクリーンショットの問題点
5のPDFファイルを使用して画像を取得したところ、WordからPDF作成で問題がありました。
貼り付けた画像解像度がWordからのPDF出力で維持できません。
ModelSimで生成したPDFは以下の状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330042/e7c726f9-2ae8-bfc6-13d3-5a4859956700.png)
これを解像度300dpiで取得すると、以下の画像がクリップボードに貼り付けられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330042/34f20ee0-6efc-d332-111d-ce35b63bcfa2.png)
これをWordに貼り付けます。400倍ズームで以下の状態なので、印刷でもなめらかそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330042/85124104-dbcf-9d2e-b1a6-93fd2e8aeae4.png)
しかしこれを、WordでPDF保存すると、解像度が下がってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330042/0d203183-545e-6807-3e06-3eb1583d80ed.png)
もちろん、保存の設定では、画像を高画質にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330042/2fd0b72e-8f89-039f-a6c3-50c55e420e96.png)

# WordでPDF出力すると、ビットマップデータは圧縮される
以下の情報によると、この方法（スクリーンショット画像をWordに貼り付けてPDF保存する）で高解像度は無理のようです。
https://answers.microsoft.com/ja-jp/msoffice/forum/all/word%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F/52735df8-5fd6-4647-9560-ad2677b5561d
また、見出し構造を維持する必要があるため、（見出し情報を維持したまま）WordからPDFを生成する必要があります。

ビットマップでなく、ベクタ形式の画像を貼り付けると、この問題は起きないようです。
EMF（拡張メタファイル）を使うとベクタ形式で貼り付けできるようなので試行していきます。

# PS形式で波形を波形を取得する

ModelSimでWave画面がアクティブの状態で、「File」－「Print Postscript」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330042/76af73c5-31ce-ba7a-fb6f-5b6c5ad2ba27.png)
「File name」を選択し、保存するファイルを選択します。
印刷する範囲を指定します。
「Setup...」をクリックすると、書式の詳細が設定できます。
「OK」をクリックすると、Postscript（.ps）ファイルを生成します。
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330042/788b4fc4-f7c4-b5c4-106f-f245346b7fdf.png)



# Postscript（.ps）ファイルからEMFファイルをつくる
PostscriptファイルからEMFファイルの生成には、pstoeditを使用します。以下のWindows版を使用しました。
https://ja.osdn.net/projects/sfnet_pstoedit/
また、pstoeditを使用するにはGhostscriptをインストールしている必要があり、以下のWindows版を使用しました。
https://ghostscript.com/releases/gsdnld.html
それぞれx86版（32bit）を使用しました。pstoeditがx86版をcallするようで、それに合わせました。
```
pstoedit.exe -rotate 270 -f emf ファイル名.ps 保存ファイル名.emf
```
rotateの値は必要に応じて設定します。
# Postscript（.ps）ファイルからPDFファイルをつくる
Wordファイルに貼り付けるemfファイルとは関係ありませんが、確認用にPDFを生成します。
```
gswin32c.exe -q -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=保存ファイル名.pdf ファイル名.ps -c quit
```
# tclコマンドからPostscript（.ps）ファイルをつくる
tclコマンドでPostscriptファイルを生成する「write wave」コマンドを使用します。
```
write wave -start 開始時間 -end 終了時間 -perpage 1ページあたりの時間 ファイル名.ps
```
開始時間、終了時間は時間単位を続けて記入します（例：「75450ns」）。
終了時間は、1ページあたりの時間より大きくなる値を設定すると、波形が崩れます。
例えば、開始時間が100nsで、1ページあたりの時間が10nsのとき、110ns以上の値を終了時間に設定すると波形が崩れます。
# tcl（.do）ファイルからWaveformを生成する
以下に詳細を記載しました。
https://qiita.com/Shantery_DS1/items/30c2ef17919535200cf8

# tcl（.do）ファイルから一括でPSファイルをつくる
複数のWaveform（.do）ファイルからそれぞれのPostscript（.ps）ファイルを一括で生成するtcl(.do）ファイルを作成します。
```
delete wave *
radix -hexadecimal
do 表示するWaveform.do
write wave -start 開始時間 -end 終了時間 -perpage 1ページあたりの時間 ファイル名.ps
write wave -start 開始時間 -end 終了時間 -perpage 1ページあたりの時間 ファイル名.ps
write wave -start 開始時間 -end 終了時間 -perpage 1ページあたりの時間 ファイル名.ps
```
複数のWaveformを実行するため、```delete wave *```で1度波形をすべて削除します。
```表示するWaveform.do```内で表示方法を設定していれば不要ですが、デフォルトの表示方法を```radix -hexadeciaml```で設定します。
1つのWaveformから時間を変えて複数の波形を取得することができます。

# シェルスクリプト（.bat）から一括でEMF、PDFファイルをつくる
シェルスクリプト内にファイル名も入れてしまえば、一括で変換ができます。
```
@echo off

set PS2EMF="D:\Program Files (x86)\pstoedit\pstoedit.exe"
set PS2PDF="D:\Program Files (x86)\gs\gs9.56.1\bin\gswin32c.exe"
set EMF_EXT=.emf
set PDF_EXT=.pdf

call :execConvert "ファイル名1.ps"
call :execConvert "ファイル名2.ps"
call :execConvert "ファイル名3.ps"

:execConvert
%PS2EMF% -rotate 270 -f emf %1 %~n1%EMF_EXT%
if %errorlevel% neq 0 (
pause
exit
)

%PS2PDF% -q -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=%~n1%PDF_EXT% %1 -c quit
if %errorlevel% neq 0 (
pause
exit
)

exit /b
```
```if```文で、変換にエラーがあったときスクリプトをそこで止め、エラーを確認します。

# おわりに
psファイルの扱いがよくわからず避けていましたが、きちんと時間とか、信号名とかを整理してtclでバッチ処理してあげると、同じ波形が何度も生成できるためデバッグの効率が上がりました。
（テスト結果を作成し、修正し、また再生成等）