PetaLinuxをzshで

12月からZynqと戯れているのだけど、
PetaLinuxをCentOS5上にインストールしたあと、
source /settings.sh
が失敗してしまった・・・・
zshだから修正しましょうと。
Xilinxさんにはzshにも対応していただきたく。。。

修正したのは上記のsettings.shスクリプトを2点だけ。

  1. ==を=に修正
  2. $BASH_SOURCEを$0に修正

前者については、=にしてもbashは問題ない。
後者については、bashで困りそう。
ということで調べた。
http://qiita.com/yudoufu/items/48cb6fb71e5b498b2532
ここを参考にして
XIL_SCRIPT_LOC_TMP_UNI=${BASH_SOURCE:-$0}
に書き換え。解決した。

必要悪なModular Interface

この記事はHDL Advent Calendar 2013の17日目の記事です。
HDLとか無関係なのに何やっているんだか・・・・

はじめに

SystemCで動作合成をやると出くわす(人も多いであろう)Modular Interfaceですが、
私はこれが割と嫌いです。厳密に言えばある条件を満たすと嫌いです。
嫌いだけどこれがないとどうしようもない・・・ってのもわかります。
だからもうSystemCも割と嫌かもwww

Modular Interfaceとは?

厳密な定義があるのかも知らないけど、まずは次の超簡単なSC_MODULEの例を見てみましょう。

SC_MODULE(test) {
  sc_in<int> i1;
  sc_out<int> o1;
  sc_in_clk clk;
  sc_in<bool> rst;
  int v;

  void proc(void) {
    wait();
    while(1) {
      v = i1->read();
      o1->write(v);
      wait();
    }
  }

  SC_CTOR(test) {
    SC_CTHREAD(proc, clk.pos());
    reset_signal_is(rst, true);
  }
};

動作合成用の記述なんて久しぶりに書きました。
当然環境がないので、合成とかしてません。
面倒なのでOSCIシミュレーションも試してませんm(__)m
ポートi1から入力をそのままポートo1に毎サイクル流し続けるだけの単純な構成です。

これをModular Interfaceを使うとどうなるかと言うと?次のコードを御覧ください。

class my_if
{
  sc_in<int> i1;
  sc_out<int> o1;

 public:
  int read() {
    return i1->read();
  }
  void write(int v) {
    o1->write(v);
  }
};

SC_MODULE(test) {
  my_if p1;
  sc_in_clk clk;
  sc_in<bool> rst;
  int v;

  void proc(void) {
    wait();
    while(1) {
      v = p1.read();
      p1.write(v);
      wait();
    }
  }
};

コンストラクタは省略しました。
要はModular Interfaceは入出力関連のポートと処理を隠蔽するためのものです。
実際にはmy_ifのポートはバスやらに応じて多種用意されますし、
そのバスを利用した外部との通信はここまで単純ではないでしょう。

何が嫌いなの?

はい、ここまで全然嫌いじゃないです。至って普通。
しかし、my_ifクラスが実はSC_MODULEでプロセスを持っていたらどうでしょう?
例えば、クラス内にFIFOバッファを持っていたりして、
read()はその最初の要素を取ってきてとか・・・
私が大嫌いなのはコレです。

SC_MODULEは外部と通信するときは自身の持つポートを介して通信しろ!
と声を大にして言いたい。
ポートを介して外部と通信している癖に、
関数を通じて内部変数にアクセスとか死ねばイイ・・・
という気持ち。心底汚いコードだと思うのです
その辺、ポートを排してしまったBSVとかイイよね!とか思う。

必要なの?

実はMaster側のポートをModular Interfaceに押し込めるだけなら、
例で見たとおりな構成で行けるので不要です。
問題はSlave側です。同じ構成でやろうとするとすぐに無理だと気付きます。
というかSlave側は何かテクニカル過ぎて頭痛くなる。
これをやろうと考えた某社と某社と某社はマジで凄いと思う。
面倒なので気が向いた人はどうすればいいか考えてみればいいと思います。

結論

Modular Interfaceは心底穢らわしいけど必要なのです。。。。orz

どうやって実現するか考えるとこうなるのはわかるけど、
本人たちは汚いとか思わなかったのかな・・・?というのもちょっと気になる。

acroreader on CentOS6.4

Adobe ReaderCentOS上で動かそうとしたら死んだ話
某ソフトのマニュアルを開こうとしたら

(acroread:4558): GLib-WARNING **: getpwuid_r(): failed due to unknown user id (1082)

というエラーがでて困っていた。
ググった結果、こんなのが https://fedorahosted.org/sssd/ticket/190

nscd を走らせればOKってこと?ってわけで走らせたら動いた。
その直前にrootで動作させたら動いていたから上記ので間違いない。
LDAPの罠ってことになるのかな

SystemC Japan 2013 のオマケ・・・

本来ならセミナーのレポートでも書いた方がいいと思うのですが、
全然関係ない所で愉快なことがあったので。

エイプリルフールネタとしてはてなに入社したのですが
まさかの前職同僚(かつ後任の人)が騙されたらしいwww
元上司様に休憩時間に「あ、はてなの人だ」とか言われて混乱したけど、
どうやらそういう話だったらしい。
多分、記事見て居室の何人かに報告しちゃったんだろうなwww

ssh-agent使ってパスフレーズ省略

鍵のペア作って、サーバに公開鍵置いてsshでのパスワード入力省略。これはいつも通り上手く行ったけど、何故かCentOSサーバからSubversionリポジトリのあるサーバへはパスフレーズを求められた。。。Debianからは何も言われないのに。 参考にしたサイトはこれ http://www.snowelm.com/~t/doc/tips/20030625.ja.html

まずは、最初の1回のログインでssh-agentとssh-addするようにして、それを使いまわすと。 ~/.zshenvに下記を追加

ssh-add -l >&/dev/null
if [ $? = 2 ] ; then
    echo -n "ssh-agent: restart...."
    ssh-agent >~/.ssh-agent-info
    source ~/.ssh-agent-info
fi
if ssh-add -l >&/dev/null ; then
    echo "ssh-agent: Identity is already stored."
else
    ssh-add $HOME/.ssh/id_dsa
fi

ここまでで終わってもよかったんだけど、完全にログアウトしたときにssh-agent生かしたままなのがちょと気持ち悪い。というわけで ~/.zsh/.zlogoutに下記を追加

if [ `who | grep hiratch | wc -l` = 1 ]; then
    eval `ssh-agent -k`
fi

ちなみにhiratchなんてアカウント名は使ってないw これで無事にそのマシンにログインしている自分のアカウントが全部ログアウトしたらssh-agent殺してくれる

Hotot on Debian 7 (Wheezy)

こないだVirtualBox上のUbuntu環境がお逝きになってしまった。仕方なくインストールまでして放置していたDebian環境を試しに使って見ることに。とりあえずひと通り設定したら最後にHototを。HototのWebサイト見るとインストール方法はUbuntuと一緒

$ sudo add-apt-repository ppa:hotot-team
$ sudo apt-get update
$ sudo apt-get install hotot

これでイケるのか?と思ったら行けなかった。エラーログ見て

/etc/apt/sources.list.d/hotot-team-ppa-wheezy.list

の中身を適当に書き換え。wheezy を raringに置換しただけですが。

[修正後]
deb http://ppa.launchpad.net/hotot-team/ppa/ubuntu raring main
deb-src http://ppa.launchpad.net/hotot-team/ppa/ubuntu raring main

結果として無事にインストールできて動きました。

sc_int<W> の Wの取得

LSI設計雑記帳にSystemC 2.3での gdbとインストールオプションという記事が。そういえば昔困ったかも・・・?とか思い出した。最後に余談で

sc_int<N> の N を知りたい場合はどうするんだろうか?

なんてことが書いてある。試しにsc_int_base.hを読んだら関数発見。下記のように書けば、Nは取得できます。

#include <systemc.h>

int sc_main(int argc, char *argv[]) {
    sc_int<8> x;
    sc_int<9> y;

    cout << "width of x : " << x.length() << endl;
    cout << "width of y : " << y.length() << endl;
    return 0;
}

ちなみにm_valに相当するのは、m_lenです。