本記事は元の記事の派生で、M1 MacでOpenLane & SkyWater PDKをGUI込みで実現する方法を紹介するのもです。
M1チップ向けのソフトウェア対応はまだまだ未成熟で、標準アプリ(AppStoreから入手可能なもの)以外のカスタム環境を構築しようとすると対応していないものがあり、苦労しますね・・・(2021年10月現在)
本記事では環境構築の部分についてフォーカスして説明しますので、OpenLaneの概要や各工程の内容については、元記事を参照ください。
M1 MacでDocker for MacのコンテナからGUIを使うとQt(GUIエンジン)の一部機能が対応していないようで、フォルダのブラウズ機能がうまく動かない問題がありました。(2021年10月現在)
GUIの部分のみDocker for Macではなく、Limaを使うことで上記問題を回避できました。
Docker for MacのM1チップ対応が十分に進んだあとは、M1用に最適化された機能が使えるのでDocker for Macを使う方が良いと思います。
それまでの間の暫定的な回避策として本記事をご活用いただきたいです。
OpenLaneに限らず、DockerのM1未対応により困った際も本記事は参考になると思います。
本記事の内容を以下の動画に収めていますので、よろしければご覧ください。
実行環境
項目 | Mac (M1チップ) |
---|---|
PC | macOS Big Sur 11.6 |
Python | 3.9.6 |
X11 | XQuartz 2.8.1 (xorg-server 1.20.11) |
Lima | 0.7.1 |
Docker(on Lima VM) | 20.10.9, build c2ea9bc |
OpenLane環境構築
Dockerをインストールしていない場合は、こちらからインストールします。
wgetをインストールしていない場合は以下のコマンドでインストールします。
HomeBrewをインストールしていない場合はこちらからインストールします。
brew install wget
ターミナルを立ち上げ、OpenLaneのGitHubリポジトリのREADMEに従い、以下のコマンドでpyyamlとclickを追加します。
pip3 install --user pyyaml click
iTerm2のインストール
こちらからiTerm2をインストールします。
iTerm2を使うのはRosetta(Intel CPUのエミュレータ)経由のターミナルとして利用するためで、通常のターミナルをRosetta経由/M1ネイティブを切り替えて使用することでも問題ないと思います。
私はM1ネイティブ用を通常のターミナル、Rosetta経由をiTerm2にして使い分けることにしました。
FinderのアプリケーションフォルダからiTermに対し「情報を見る」→「Rosettaを使用して開く」を設定します。
これでiTerm2はRosetta経由で立ち上がるようになります。
以降の処理のうち、make pdk
を実行する際に使用します。
OpenLane環境のダウンロード
任意の作業ディレクトリを作ってcd
でそのディレクトリに移動し、git
コマンドでGitHubからOpenLane環境をダウンロードします。
git clone https://github.com/The-OpenROAD-Project/OpenLane.git
OpenLane環境のビルド
OpenLane環境のビルドを行います。
cd OpenLane make openlane
docker images
を実行してefabless/openlaneイメージが表示されれば成功です。
次にiTerm(Rosetta経由)を立ち上げ、OpenLaneディレクトリに移動し、make pdk
を実行します。
cd OpenLane make pdk
ここでRosetta経由のターミナルを使用する理由は、make pdk
内でダウンロードされるビルド用のシェルスクリプトファイルがARM CPU(M1のCPU)に対応したものが存在せず、Intel CPUと見せかけて実行しないとうまく処理が進まなくなってしまうためです。
これでpdksディレクトリ以下にPDKが展開されます。
iTerm(Rosetta経由)を使うのは上記make pdk
だけで、以降では使用しないため、iTermを閉じます。
OpenLane環境のテストを行います。
make test
エラー無く流れれば成功です。
GUIを使う方法
Xquartzのインストール
DockerでGUIを表示するための常套手段とも言えるSSHのX11 forwardingを使います。
以下のコマンドでXquartzをインストールします。
HomeBrewをインストールしていない場合はこちらからインストールします。
brew install --cask xquartz
Lima環境構築
Limaの環境構築の際に参考にさせていただいたこちらの記事は、docker
と入力するとLima上のDockerを呼び出すようにする設定をしていますが、docker
と入力した場合はDocker for Mac、lima docker
と入力した場合はLima上のDockerとして使い分けたかったので、同記事の方法を部分的に採用させていただきました。
できれは元記事と同じくdocker-composeを使いたかったのですが、うまく行かなかったので、すべてdockerコマンドで実行するようにしています。
各種Dockerコマンドはrun_〜に記載して、できるだけ簡単に実行できるようにしてあります。
Limaをインストールします。
brew install lima
M1用のパッチを適用します。
brew tap knazarov/qemu-virgl brew install qemu-virgl brew unlink qemu brew link qemu-virgl
GitHubからOpenLane環境のビルドに必要なファイルをダウンロードします。
cd .. git clone https://github.com/tak6uch1/OpenLane_GUI
ダウンロードしたOpenLane_GUIからM1用のファイルをコピーします。
cd OpenLane_GUI cp -r *M1 default.yaml ../OpenLane
default.yamlはhttps://raw.githubusercontent.com/chibiegg/lima-config/master/docker.yamlに対し、ホームディレクトリの書き込み権限を追加したものになります。
設定ファイルdefault.yamlを指定してLima VM(Virtual Machine)を構築します。
cd ../OpenLane limactl start default.yaml
上記設定によりLima環境にDockerがインストールされます。
コマンドの頭にlimaをつけてdockerコマンドがエラー無く実行できることを確認しておきます。
lima docker ps
Lima上のDockerイメージビルド
gui_M1/Dockerfileは以下(抜粋)のようになっており、passwordの部分はお好みの内容に変更してください。
ARG PASS=password
Lima上のDockerでは、ディスク共有したディレクトリはコンテナ内でrootオーナーになり、ユーザーログインだと書き込みができなかったので、rootログインするようにしました。
efabless/openlaneイメージにopenssh-serverを追加してsshdサーバを立ち上げるようになっています。
vim(viの高機能版)を立ち上げることも多いでしょうから、合わせてインストールし、viにエイリアス(別名をつける、viと入力するとvimが起動)しています。
また、klayoutをレイヤーマップ指定で立ち上げるコマンドは長いので、kl <GDS-file>
で実行できるようにするためのエイリアスも定義しています。
さらにmagicでDEF/LEFを開くコマンドも長いため、mdef <DEF-file>
で実行できるようにfunction定義しています。
上記はDockerコンテナにパスワードを使ったSSHログインをするための記述例になります。
DockerコンテナのSSHログイン用ポート22番をネイティブマシンの49944番(別のポートでも構いません。下に紹介するrun_ssh.M1の中身と同じ番号にしておく必要があります。)に割り当てています。
GUIを使うためのSSHDサーバーを起動するDockerコンテナのビルドを行います。
./run_build.M1
Lima VMを停止します。
limactl stop
Lima上のDockerコンテナ起動
Lima VMとLima上のDockerコンテナを起動します。
./run_server.M1
これでSSHDサーバが起動し、SSHログイン可能な状態になります。
SSHログインします。
./run_ssh.M1
パスワードを聞かれるので、上記gui_M1/Dockerfileで設定したパスワードを入力してログインします。
うまくログインできない場合は、~/.ssh/known_hostsを削除してから実行してみてください。
コンテナにログインできたらflow.tcl
を実行できます。
cd /openLANE_flow ./flow.tcl -design spm
KLayoutでGDSを表示
KLayoutでレイアウト結果のGDSを表示します。
kl designs/spm/runs/〜/results/magic/spm.gds
kl
はOpenLaneで用意されたコマンドではなくklayout -l /openLANE_flow/pdks/sky130A/libs.tech/klayout/sky130A.lyp
の省略形として.bash_profileに定義したエイリアスです。
下の用に表示されれば成功です。
KLaoutでDEF/LEFを表示
以下のコマンドでKLayoutを立ち上げ、File→Import→DEF/LEFからDEFファイルを開きます。
klayout
designs/spm/runs/〜/results/routing/17-spm.defなどを開いてみると良いでしょう。
2回目のklayout起動時でないとTechnology Setup設定ができないのは、元記事と同様です。
MagicでDEF/LEFを表示
以下のコマンドでMagicを使用してDEF/LEFを開きます。
mdef designs/spm/runs/〜/results/routing/17-spm.def
mdefはMagicでDEFを指定するだけで同じディレクトリにあるLEFも読み込んで開くための自作の便利コマンドです。
以上でM1 MacでGUIが正しく表示できたのではないかと思います。
終了する場合、まずLima VMから抜けます。
exit
以下のコマンドでLima VMを停止します。
./stop_server.M1
初回以降の起動方法
次回以降の起動方法も初回と同様です。
./run_server.M1 ./run_ssh.M1 cd /openLANE_flow
終了する場合は以下のコマンドを実行します。
./stop_server.M1
書籍紹介
入門Verilog HDL記述―ハードウェア記述言語の速習&実践 (Design wave basic)
記述例を見ながら実践的なVerilog回路の書き方を学ぶことができ、初心者にやさしく、半導体関連企業における新人研修で使われることもあるようです。
わかるVerilog HDL入門―文法の基礎から論理回路設計、論理合成、実装まで (トランジスタ技術SPECIAL)
トラ技派生のVerilog入門書でFPGAを使った実践的な内容も紹介されており、基礎から応用まで丁寧に説明されていて、特にFPGAで自作回路を作りたい方には最適な書籍だと思います。
参考文献
- Docker Desktop for Macの実用的な代替手段: lima + Docker(https://qiita.com/yoichiwo7/items/44aff38674134ad87da3)
- macOSでもWSLみたいなLinux環境を手に入れる(https://qiita.com/chibiegg/items/eede37345f7058ce604d)
- iTerm2(https://iterm2.com/)