Prismjs

2020年1月19日日曜日

Vivadoのxprファイルについて


ERROR:[ProjectBase 63-9] XML parser encountered a problem in C:/Users…….xpr at line 1:XML character encoding not supported

上記のようなエラーが出現し、vivadoのプロジェクトが開けなくなってしまった。
xprファイルを直接ダブルクリックで開いても、vivadoからOpen Projectで開いても同様のエラーが出てしまう。

xprファイルのエンコーディングがおかしいと言っているようなので、エディタで開いてみた。

エンコードを色々変えても正常な文字が表示されず、なんだかファイルが壊れていそうな雰囲気だった。ためしに問題なく起動できるxprをエディタで開いてみた。

エラーメッセージからも推測できるが、xprファイルはプロジェクトの構造をXML形式で記述したもののようだ。
なぜxprが壊れたのか考えると、思いあたる点は2つ。
1つ目はこのプロジェクトがほかのパソコンで作ってコピーしてきたものであること。今のパソコンにしてから開いていない。ただvivadoのバージョンは同じでどちらもwindows10なのでこれが原因とは考えにくい。
2つ目は前のパソコンでそのプロジェクトのbitstream作成中にフリーズしてしまい強制電源断を行っていたことだ。そのあと前のPCでもこのプロジェクトを開いていなかった。Bitstream作成中に強制電源断したことによりxprファイルがバグってしまったと考えられる。

xprを復元する方法が見つからなかったが、せっかくなのでxprファイルについて検証してみた。

検証1
まず原本となるプロジェクトを作成し(ここではDesktopディレクトリに作成した)開き、File locationLocal to Projectのままでソース(ここではtest.v)を新規作成追加した。そして、丸々べつのディレクトリ(ここではDownloadsディレクトリ)に原本のプロジェクトディレクトリごとコピーした。その後コピーしたプロジェクトのソース(test.v)を開き確認したところ、参照先はコピープロジェクトのパスになっていた。

この時点ではコピープロジェクトはソースを開いたりしただけで何も編集はしていなかった。このときコピープロジェクトのxprをエディタで開いてもパスは原本プロジェクトのままであり、更新日時も原本プロジェクトのままであった。

次に開いているコピープロジェクト内にFile locationLocal to Projectのままでソース(test2.v)を新規作成追加した。追加したソース(test2.v)のパスはコピープロジェクトのパスになっていた。この時点でコピープロジェクトのxprを開くと更新された形跡があった。xprファイル内の先頭のほうに書かれているパスがコピープロジェクトのパスに書き換えられていた。(そのほかtest2.vが追加されたことによりプロジェクトの内部構成記述も変わっていた。)



検証2
検証1で作成した原本プロジェクトのxprファイルのみプロジェクトディレクトリ外に移動し、移動先で原本のxprファイルを起動した。すると問題なく起動し、起動したプロジェクトはソースなども含めてすべて原本プロジェクトディレクトリのパスを参照していた。

次に開いているプロジェクトにFile locationLocal to Projectのままでソース(test3.v)を新規作成追加した。すると追加したtest3.vのパスはプロジェクトのディレクトリではなく、xprがあるディレクトリに追加のタイミングで自動生成されたディレクトリの中になっていた。

これにより、File locationLocal to Projectというのはxprが置いてあるディレクトリを指していることが分かった。
この時点でのxprをエディタで見てみるとパスはxprがある場所に書き換えられていた。

test.vtest3.vxpr内でどのようなパスで指定されているのか見てみた。

PPRDIRというのが今のxprファイルがあるディレクトリのパスを指しているのではないかと推測した。

以上の検証により、
プロジェクトを開く際にvivadoは、xprファイルと同階層に参照可能なプロジェクトを構成するディレクトリが存在する場合はそちらを参照し、存在しない場合にxprファイルの最初のほうに書かれているパスを参照しているようであることが分かった。
つまり、vivadoプロジェクトをプロジェクトディレクトリごとまるっとコピーする分には特に問題がないといえる。ただしxprファイルだけ別に移動してプロジェクトを開き編集するとパスがごちゃごちゃになり、vivadoが勝手にxprと同階層にファイルやディレクトリを作るので推奨されない。


検証3
プロジェクトを作成し、xprと同一階層(プロジェクトディレクトリ内)にあるディレクトリ(例ではmysourcesという名前)に入っているソース(test1.v test2.v)をプロジェクトに追加した。なおソース自体の場所はmysourcesに入ったままで、プロジェクトがmysources内を参照する設定とした。
このときxprをエディタで見ると、test1.vtest2.vPPRDIR によりxrpに対する相対パスとして場所が示されていることが分かった。

このプロジェクトディレクトリごとまるっと別の場所にコピーして、コピーしたxprを開いた。xprにはxprを中心に見た相対パスで場所が書かれていたためtest1.vtest2.vなどのソースはまるっとコピーされたときにコピーされたソースを示しているのが確認できた。


検証4
ではmysourcesxprより上の階層(プロジェクトディレクトリの外)にあった場合、コピー後のプロジェクトソースはどこを参照するのだろうか。
プロジェクトを作成し、今度はxprの上階層(プロジェクトディレクトリ外)にあるディレクトリ(例ではmysourcesという名前)に入っているソース(test1.v test2.v)をプロジェクトに追加した。検証3と同様にソース自体の場所はmysourcesに入ったままで、プロジェクトがmysources内を参照する設定とした。このときxprをエディタで見ると、test1.vtest2.vは検証3と同様の手法でPPRDIR によりxrpに対する相対パスとして場所が示されていることが分かった。

同様にこのプロジェクトディレクトリごとまるっと別の場所にコピー(mysourcesはそのまま)して、コピーしたxprを開いた。xprにはそのxprを中心に見た相対パスで場所が書かれていると思っていたので、test1.vtest2.vなどのソースは参照できないのではないかと思っていたのだが、普通に参照できていた。xprはコピー前から変更された形跡はない。ということはPPRDIRはそのxprがあるディレクトリを指しているわけではないと判明した。
このコピーしたプロジェクトに適当にソースを追加してupdatingさせxprを更新させ、xprをエディタで開くとtest1.vtest2.vのパスの記述が変わっていた。

ここでやっとPPRDIRxprファイルの冒頭のパスを示していることが分かった。
この仕組みならプロジェクトディレクトリ外のソースを参照していても、プロジェクトフォルダを移動させたときにパスがおかしくなるようなことはなさそうだ。


まとめ
vivadoプロジェクトはプロジェクトディレクトリごとコピーすれば、ソースがどこにあろうが参照パスに問題は発生しない。
xprファイルのみを移動してプロジェクトを開いてはいけない
sourcesに更新マーク(updating)がある時にxprなどを更新していると思われる。

xpr更新中に電源断などのアクシデントがあるとxprが壊れることがある。


0 件のコメント:

コメントを投稿