O HAI THIS BLOG PURPZIEZ 2 B UZED AZ MAH PLESIOUS MEM. :)

2009/12/25

MeasureSLOC(&LMS); /* 2009/12 */

今年最後のdiffstat.
bench/BENCH_CALCULATE_SNR_SINR.vhd |   25 
bench/BENCH_DIVSR_RR.vhd           |  206 +
bench/BENCH_DIV_SS.vhd             |  209 +
bench/BENCH_DIV_UU.vhd             |  147 +
bench/BENCH_S1IC.vhd               |  433 +++
bench/BENCH_S1WCAL.vhd             |  925 +++++++
bench/BENCH_S2WFMA.vhd             |  426 +++
bench/BENCH_S4LLR.vhd              |  167 +
bench/BENCH_S5LDPCD.vhd            |  175 +
bench/BENCH_S6PP.vhd               |  262 ++
bench/BENCH_S7RIE.vhd              |  331 ++
bench/BENCH_S7SRG.vhd              |  330 ++
bench/METABENCH_S1IC.vhd           |   43 
bench/METABENCH_S1WCAL.vhd         |   99 
bench/METABENCH_S2WFMA.vhd         |   69 
bench/METABENCH_S4LLR.vhd          |   69 
bench/METABENCH_S5LDPCD.vhd        |   69 
bench/METABENCH_S6PP.vhd           |   28 
bench/METABENCH_S7RIE.vhd          |  141 +
bench/METABENCH_S7SRG.vhd          |   43 
vhdl/ABS2SR_C.vhd                  |  311 ++
vhdl/ABS2ST_C.vhd                  |  235 --
vhdl/ADDSR_CC.vhd                  |  140 +
vhdl/ADDSR_RR.vhd                  |  243 ++
vhdl/ADDSR_UU.vhd                  |  255 ++
vhdl/ADDST_CC.vhd                  |  196 -
vhdl/CALCULATE_SINR.vhd            |   68 
vhdl/CALCULATE_SNR.vhd             |  205 -
vhdl/DIVSR_CR.vhd                  |  161 +
vhdl/DIVSR_RR.vhd                  |  336 ++
vhdl/DIV_SS.vhd                    |  254 ++
vhdl/DIV_UU.vhd                    |   13 
vhdl/ESTIMATE_NOISE.vhd            |   35 
vhdl/LDPCD-stub.vhd                |    3 
vhdl/LLR2PP.vhd                    |  266 +-
vhdl/MULSR_CC.vhd                  |  420 +++
vhdl/MULSR_CR.vhd                  |  307 ++
vhdl/MULSR_CRCONST.vhd             |  138 +
vhdl/MULSR_RR.vhd                  |  245 ++
vhdl/MULSR_RRCONST.vhd             |  237 ++
vhdl/MULSR_UU.vhd                  |  222 +
vhdl/MULSR_UUCONST.vhd             |  214 +
vhdl/MULST_CC.vhd                  |  283 --
vhdl/NbySNR.vhd                    | 4285 +------------------------------------
vhdl/NbySNR_ROM.vhd                |  595 +++++
vhdl/PP2RIE.vhd                    |  212 +
vhdl/PP2SRG.vhd                    |  275 +-
vhdl/PSQUASH.vhd                   |   90 
vhdl/ROUND.vhd                     |  142 +
vhdl/S1IC.vhd                      |   30 
vhdl/S1WCAL.vhd                    |  931 ++++++++
vhdl/S1WCCM.vhd                    |  275 ++
vhdl/S1WCFA.vhd                    |  355 +++
vhdl/S1WCFB.vhd                    |  386 +++
vhdl/S1WDET.vhd                    |  431 +++
vhdl/S1WINV.vhd                    |  293 ++
vhdl/S2WFMA.vhd                    |   58 
vhdl/S3SINR.vhd                    |   84 
vhdl/S4LLR.vhd                     |    8 
vhdl/S5LDPCD.vhd                   |   49 
vhdl/S7RIE.vhd                     |  100 
vhdl/S7SRG.vhd                     |  146 -
vhdl/SRG2IC.vhd                    |  317 +-
vhdl/SUBST_CC.vhd                  |  196 -
vhdl/WCCM.vhd                      |  228 +
vhdl/WFMA.vhd                      |  244 +-
66 files changed, 12916 insertions(+), 5798 deletions(-)
NbySNRをROM化した影響で他の変更分がかすんでしまった. :DDD
主要な行列演算部分をelaborate-time fixed pointなオレオレプリミティブで構成したので,後でbit精度が問題になってもなんともないぜ,さすがオレ!!1 :DDD

2009/12/06

MeasureSLOC(&LMS); /* 2009/11 */

新しいブツのdiffstat,11月分.
bench/BENCH_CALCULATE_SNR_SINR.vhd |  343 ++
 bench/BENCH_DIV_UU.vhd             |   92 
 vhdl/ABS2ST_C.vhd                  |  235 ++
 vhdl/ACB.vhd                       |  172 +
 vhdl/ACN.vhd                       |  266 ++
 vhdl/ACW.vhd                       |  307 ++
 vhdl/ADDST_CC.vhd                  |  196 +
 vhdl/CALCULATE_SINR.vhd            |  196 +
 vhdl/CALCULATE_SNR.vhd             |  377 +++
 vhdl/COMMON_TYPE_PKG.vhd           |   60 
 vhdl/DECIMATE_SYMBOL.vhd           |  194 +
 vhdl/DIV_UU.vhd                    |  200 +
 vhdl/ESTIMATE_NOISE.vhd            |  239 ++
 vhdl/EXTRACT_AC.vhd                |  217 +
 vhdl/EXTRACT_DATA.vhd              |  228 +
 vhdl/LDPCD-stub.vhd                |   80 
 vhdl/LDPCD.vhd                     |  241 ++
 vhdl/LLR2PP.vhd                    |  294 ++
 vhdl/MULST_CC.vhd                  |  283 ++
 vhdl/NbySNR.vhd                    | 4271 +++++++++++++++++++++++++++++++++++++
 vhdl/PP2RIE.vhd                    |  287 ++
 vhdl/PP2SRG.vhd                    |  252 ++
 vhdl/S1IC.vhd                      |  191 +
 vhdl/S2WFMA.vhd                    |  147 +
 vhdl/S3SINR.vhd                    |  267 ++
 vhdl/S4LLR.vhd                     |  388 +++
 vhdl/S5LDPCD.vhd                   |  558 ++++
 vhdl/S6PP.vhd                      |  135 +
 vhdl/S7RIE.vhd                     |  263 ++
 vhdl/S7SRG.vhd                     |  307 ++
 vhdl/SCB.vhd                       |  147 +
 vhdl/SCN.vhd                       |  237 ++
 vhdl/SCW.vhd                       |  242 ++
 vhdl/SRG2IC.vhd                    |  252 ++
 vhdl/SUBST_CC.vhd                  |  196 +
 vhdl/UMA_IN_SYMBOL.vhd             |  238 ++
 vhdl/UMA_OUT_SYMBOL.vhd            |  228 +
 vhdl/WFMA.vhd                      |  160 +
 38 files changed, 12986 insertions(+)
大分書いているみたいだが,NbySNR.vhdがデカ過ぎだな.12bit入力のpre-calculated LUTなので仕方ないと言えば仕方ないが.

2009/11/28

SUPER_COMPUTER >> DIV_UU

ニュースやらblogやらtwitterやらでゴチャゴチャ五月蝿ぇので暴言を吐いたら,masatomon先生にRTされちまったので除算器のVHDLを晒すと言うネタをやってみる.

仕様から説明するか.入力は符号無し整数の被除数と除数,ビット幅は双方同一とするが特に大きさは制限しない.出力は商と剰余,それから零除算インジケータ.スループットは1 division/CLK,入出力レイテンシは制限しない.本来はもっと考えるトコロがあるケド,メンドイので他には制限無し.ただし,合成出来て,あんまりデカくなくて,なおかつそれなりに早く動く事.

で,実装.冗長2進数だの高基数だのはメンドイのでやらない.算術シフトとコンパレータと減算をパイプラインで行う.ソースはバケツに突っ込んだ.イメージ的にはタダの筆算.

で,シミュレーション.ビット数をデカくするとたるいので,3bitでやったのが,これ.


で,合成.アルテラ謹製のくぉーたすつーでプロジェクトの設定はデフォルトのまま突っ込んだら,こうなった.ちなみにビット幅は32bitね.
Fitter Status : Successful - Sat Nov 28 02:29:38 2009
Quartus II Version : 9.0 Build 184 04/29/2009 SP 1 SJ Web Edition
Revision Name : DIV_UU
Top-level Entity Name : DIV_UU
Family : Stratix III
Device : EP3SL70F780I4L
Timing Models : Final
Logic utilization : 10 %
    Combinational ALUTs : 2,018 / 54,000 ( 4 % )
    Memory ALUTs : 0 / 27,000 ( 0 % )
    Dedicated logic registers : 3,235 / 54,000 ( 6 % )
Total registers : 3235
Total pins : 133 / 488 ( 27 % )
Total virtual pins : 0
Total block memory bits : 0 / 2,267,136 ( 0 % )
DSP block 18-bit elements : 0 / 288 ( 0 % )
Total PLLs : 0 / 4 ( 0 % )
Total DLLs : 0 / 4 ( 0 % )

Analysis and Synthesis Status : Successful - Sat Nov 28 02:28:35 2009
Quartus II Version : 9.0 Build 184 04/29/2009 SP 1 SJ Web Edition
Revision Name : DIV_UU
Top-level Entity Name : DIV_UU
Family : Stratix III
Logic utilization : N/A
    Combinational ALUTs : 2,006
    Memory ALUTs : 0
    Dedicated logic registers : 3,235
Total registers : 3235
Total pins : 133
Total virtual pins : 0
Total block memory bits : 0
DSP block 18-bit elements : 0
Total PLLs : 0
Total DLLs : 0

------------------------------------------------------------
TimeQuest Timing Analyzer Summary
------------------------------------------------------------

Type  : Slow 900mV 100C Model Setup 'iCLK'
Slack : -5.132
TNS   : -7413.304

Type  : Slow 900mV 100C Model Hold 'iCLK'
Slack : 0.541
TNS   : 0.000

Type  : Slow 900mV -40C Model Setup 'iCLK'
Slack : -5.259
TNS   : -7461.099

Type  : Slow 900mV -40C Model Hold 'iCLK'
Slack : 0.507
TNS   : 0.000

Type  : Fast 900mV -40C Model Setup 'iCLK'
Slack : -1.902
TNS   : -1922.378

Type  : Fast 900mV -40C Model Hold 'iCLK'
Slack : 0.229
TNS   : 0.000

------------------------------------------------------------

これだけやってもiCLKは159.77MHzでしか動かない.ディジタル回路なめんなよ.スパコンはもっともっと大変なブツだぞ!!1 :P

更新:200MHz行かないのが納得出来んので,カッとなってパイプラインを三倍にした.今は反省はしていない. :DDD


再合成してみたら198.89MHzで動く様になったらしい.やっぱこの除算アルゴリズムで200MHzは無理か. :P
Fitter Status : Successful - Sat Nov 28 12:54:15 2009
Quartus II Version : 9.0 Build 184 04/29/2009 SP 1 SJ Web Edition
Revision Name : DIV_UU
Top-level Entity Name : DIV_UU
Family : Stratix III
Device : EP3SL70F780I4L
Timing Models : Final
Logic utilization : 18 %
    Combinational ALUTs : 2,039 / 54,000 ( 4 % )
    Memory ALUTs : 0 / 27,000 ( 0 % )
    Dedicated logic registers : 9,288 / 54,000 ( 17 % )
Total registers : 9288
Total pins : 133 / 488 ( 27 % )
Total virtual pins : 0
Total block memory bits : 0 / 2,267,136 ( 0 % )
DSP block 18-bit elements : 0 / 288 ( 0 % )
Total PLLs : 0 / 4 ( 0 % )
Total DLLs : 0 / 4 ( 0 % )
Analysis and Synthesis Status : Successful - Sat Nov 28 12:52:15 2009
Quartus II Version : 9.0 Build 184 04/29/2009 SP 1 SJ Web Edition
Revision Name : DIV_UU
Top-level Entity Name : DIV_UU
Family : Stratix III
Logic utilization : N/A
    Combinational ALUTs : 2,039
    Memory ALUTs : 0
    Dedicated logic registers : 9,288
Total registers : 9288
Total pins : 133
Total virtual pins : 0
Total block memory bits : 0
DSP block 18-bit elements : 0
Total PLLs : 0
Total DLLs : 0
------------------------------------------------------------
TimeQuest Timing Analyzer Summary
------------------------------------------------------------

Type  : Slow 900mV 100C Model Setup 'iCLK'
Slack : -3.580
TNS   : -14902.996

Type  : Slow 900mV 100C Model Hold 'iCLK'
Slack : 0.466
TNS   : 0.000

Type  : Slow 900mV -40C Model Setup 'iCLK'
Slack : -4.028
TNS   : -14569.313

Type  : Slow 900mV -40C Model Hold 'iCLK'
Slack : 0.447
TNS   : 0.000

Type  : Fast 900mV -40C Model Setup 'iCLK'
Slack : -1.117
TNS   : -2389.571

Type  : Fast 900mV -40C Model Hold 'iCLK'
Slack : 0.202
TNS   : 0.000

------------------------------------------------------------

2009/11/25

MeasureSLOC(&AL9); /* 2009/09~ */

AでLで9なdiffstat,9月以降の終了まで.
bench/BENCH_CLDPCDOP.vhd      |    6 
bench/BENCH_FCO.vhd           |   53 +++
bench/BENCH_LDPCDDB.vhd       |   16 +
bench/BENCH_LDPCTX2LDPCRX.vhd |    4 
bench/BENCH_PE2RST.vhd        |    3 
bench/BENCH_SELDPCDIPM.vhd    |  141 ++++++++++
vhdl/AFIFO.vhd                |    7 
vhdl/BCBOOL.vhd               |   15 -
vhdl/BER_IF_REG.vhd           |   17 +
vhdl/CLDPCDOP.vhd             |   36 --
vhdl/COS_VLSX4_MEM.vhd        |   71 ++++-
vhdl/ELDPCDIP.vhd             |  103 +++++++
vhdl/FCOD-stub.vhd            |  166 ++++++++++++
vhdl/FCOD.vhd                 |   42 ++-
vhdl/FCO_NG.vhd               |  577 ++++++++++++++++++++++++++++++++++++++++++
vhdl/FP1_LDPCRX.vhd           |   53 +++
vhdl/FP1_LDPCTX.vhd           |    9 
vhdl/FP2_LDPCRX.vhd           |   15 +
vhdl/FP3_LDPCRX.vhd           |   34 +-
vhdl/FP4_LDPCRX.vhd           |   50 ++-
vhdl/LDPCD-stub.vhd           |    4 
vhdl/LDPCD.vhd                |  167 +++++++-----
vhdl/LDPCE.vhd                |   91 ++++--
vhdl/LDPCEDB.vhd              |   42 ++-
vhdl/PE2RST.vhd               |   58 ++++
vhdl/RX_LX_FEBE.vhd           |   17 +
vhdl/SELDPCDIPM.vhd           |   76 ++++-
vhdl/SFIFO.vhd                |    7 
vhdl/UACCUM.vhd               |    7 
vhdl/XDPRAM.vhd               |  125 ++++++---
30 files changed, 1767 insertions(+), 245 deletions(-)
2kSLOCくらいだったみたい.

FCO.vhdがアレだったのでrewriteしてFCO_NG.vhdっつーのを作った.実機にはぶっ込んでないけど,rewriteしただけあってかなりイイ線を逝っている,と個人的には思っている.「良く考えてから書けよ」とかいつも思うんだが,やっぱりcodeのpolish upにrewriteはとても良い.そう言う意味で片手間でrewrite出来る様なstyleであるTPは多いに有利に働いているぜよ.

時間に追われて精神衛生上は良くないと感じるcodeを垂れる事はままある,大人の事情ってヤツね.それを除いても,書いているうちに具合が悪くなる傾向ってのはある.そして,大方のそーゆーcodeは何か良くないトコロがやっぱりある.それを設計の時点で気付けば良いのだけど,俺達ぁエスパーじゃないから,大抵はやらかした後に落ち着いて吟味した後に初めて気付く.

オレの数少ない経験から言うと,本来,抽象化されるべき機能は,要求される仕様の数層上のレイヤーにある.codeのrewriteは演繹でも帰納でもなく,自身の誤謬可能性を認めた上での合理主義に基づく妥当な行為である.そしてrewriteを躊躇する様なstyleならば,その様なstyleは邪悪である.

また別のブツを書き始めたのでクソcodeにならない様に気をつけようと思ふ. :D

2009/11/14

$((A \subset B) \land B) \subset A$

この前も書いたけど,個人的にはあんまりオレオレ形而上学的な事は言いたくないんだよなぁ.ヒキコモしながらエア思索する事は良くあるけど,その手の事はあんまり話題にはしないし,したくないんだよなぁ.まー,喋る相手も居ねぇが. :P

最近の流行の形而上学は知らねぇけど,フツーの大学の学部まで勉強したなら形而上学の歴史で出てくる人の中にカントが居るのは知っていると思う.リンク先にも書いてあるケド,カントもフツーの人とは哲学ちっくな話題を交えるのを露骨に嫌がってたらしい.その辺りの感覚は何となく分かるんだけど,今までキチンと納得出来てなかった.

最近,難しかったので積読して本棚のこやしになっていたカントのプロレゴーメナを発掘したので,もう一度挑戦してみたら,この手の不機嫌の理由を説明しやすい言い回しがある事に気付いた.
序説 一般的問題
いかにして純粋理性からの認識は可能か

(中略)

そこで,この上も無く重大である本来の課題は,厳格な正確さで言い表すと,次の様になる.

いかにしてア・プリオリな綜合的命題は可能か.

(中略)

ところで,形而上学の存亡,したがってその存在はまったくこの課題の解決にかかっている.だれにせよ形而上学において自分の主張をどんなにもっともらしく述べようとも,また息がつまるほどに,推論に推論を積み重ねようとも,もし彼が先の問いにまず十分に答えることができなければ,それはすべて空虚な,根拠のない哲学であり,偽った知恵であると私が言っても正当であろう.君は純粋理性によって語り,そしてただ与えられた概念を分析するだけではなく,矛盾律によらない,しかもまったくすべての経験から独立に君が見抜いたと思い込んでいる新しい結合を申し立てて,それでア・プリオリな認識をいわば創造したと君は誇らしげに言う.それなら,君はいかにしてこれに至ったのか.いかにして君はそういう自負について自分を正当化しようとするのか.常識の賛成に訴えることは君には許されない.なぜなら,常識という証人は,その尊敬が単に世評にもとづくものにすぎないからである.

君がそう私に示すすべてを,私は信ぜず,これを嫌う.

ホンの一部引用しただけだし,もちろんこれで終わりじゃあなくて,この先もかなりイイ事が書いてあるんだけど,引用すんのダルいし十分だろ.一番長ぇ所を蝶意訳してみるか.

つまり,オレオレ主張の価値は「なんでそーゆーオレオレ主張出来るのかと言う理由付けが出来るか?」に生命線が走っている.誰が唱えようと,どんなにもっともらしく聞こえようとそんな事ぁ,関係無い.首が絞まるくらい論理をこねくりまわしてもこの質問に答えられないなら,「何?そのオレオレ主張,マジウケる,腹痛ぇ.」とかミソクソに言われても仕方が無なくね?テメーはそれっぽく,かつ偉そーに自説を開陳しまくっている様だが,根拠はキチンとあるんだろうな?なんか分析した結果だとか,論理的に推論したとか,経験したとか,まして「常識だろ?」なんて言わせねーぞ.常識なんかは時が経てばコロコロ変わっちまうじゃねーか.

あー,説明すんのって面倒臭ぇなぁ. :DDD

2009/11/13

efficient++; /* wrong */

仕事でお得意様々に伺って仕様のレビューをしてもらいに行った電車の中で,いつも通りテキトーに上司と喋ってた.新しいプロジェクトでその上司の上司から「作業の効率化をしろや!」とか言われてどーすっかなーとか考えてるって話題があった.「ふーん,へー,ほー.じゃ,がんばってねー」とか返して終わらしても良かったし,あんまオレオレ形而上学的な事はなんとなく声高に言いたくなかったんだけど.道中暇なので年下の不良社員なのに偉そうな事を言ってみた.巧く伝わったかどうかわからんし,別に伝わってなくてもオレは全く構わねぇんだが,折角なので言いたかった事をまとめておこう.

よくあるよね,こう言う要求.オレ様の数少ない経験から言うと,大抵の短絡的で使えねぇマネージャとかはこう言う事良く言うんだぜ!!1「作業が計画通り旨く進まないのは作業の効率が悪いからだ.作業の効率化をしろ!そうすれば作業時間が短くなるじゃねーか?」そうね,その通り.だが,そうは問屋が卸さんぜよ. :D

言っちゃあ何だが,アンタってもしかして頭悪くね?「作業を効率化しろ!」って言うだけで効率が上がったらエンジニアは誰も苦労なんかしてねぇよ,カスめ.しかもそんだけしか言わないクセに,言外には悪意ある真意が隠されていると疑っちまうよなぁ,フツー.言っちまえよ,本音はこうだろ?「オレ様が計画してやった無茶な工程がウマい感じで事が運ぶ様にする為に,オレが具体的な効率化の方法を考えんのは面倒臭ぇから,テメーの作業がどう言うものかヨクワカランが何とかして作業を効率化しろ!そんでオレのマネージャとして評価が上がる様に精々汗水垂らして働くがいい!」ハイハイ,悪意満載,蝶ウケる,腹痛ぇ. :DDD

この手の無茶な要求はそう思っても言明しない場合に比べて悪影響を実働隊に与えると思うんよ,オレは.具体的な方法を提示せず,結果だけ楽観視して一見筋が通っていてマトモに聞こえるんだが,言外に利己的な本音が見え隠れする様に聞き手側にとられかねない様な言い回しだと顕著に.その最たる弊害は,その言明が実働隊に与える無意味なプレッシャーに起因するやる気の低下,横文字で言うと,incentiveが段々無くなっていっちまう訳だ.んーな事も分からんタコは豆腐の角に頭ぶつけてタンコブでも作ってなさい. :P

一応断っておくと,オレは大した事をやってるつもりは無いんだけど.最近,片手間ながら後輩が午前中いっぱいかけてロジアナで取ってきた実機のログをシミュレーション結果と比較するのにMS謹製のExcelで比較しようとしてデータ数キャパを超えてしまった事があった.しょーがないんでawkとかdiffとか使って一致確認を一分位でやったんよ.shellでコマンド打つ度に隣で後輩が「えー」とか言ってた.いや,別に驚く事って無くね?unixyな環境齧ってるヤツなら常識だろ?

上の例はあんま巧い例じゃないけど,所謂フツーの人達からはそう言う行為は奇異でtrickyに見えるかもしれんなー,と感じた.けど,そう言うちょっとした事を何気なく,しかも常識的に行える様になって初めて作業の効率化ってのは功を奏すと思うんよ,オレは.クソの役にもたたない楽観的指示ってのはincentiveの低下と言う的外れな結果しか生まない.だからって無い知恵を絞って無理矢理具体化した指示を出しても現実性に欠けたり,場当たり的な対処でしか無い場合が容易に想像出来る.

自分のやっている作業が本当は効率が悪いのではないか,と疑う所がスタートライン.効率化を図るスキルの獲得は必要な事であり欠かす事が出来ない,いわば呼吸をする様なモノ.そーゆーモノは日々過ごす環境から自ら,だがそれと意識しないで染み付いていってしまうモノなんだなぁ,と思った.勿論,やろうとするincentiveが憑いていれば,尚の事,良しなんだろうけど.取り敢えず,スーハースーハーと深呼吸でもして下さい. :P

「まー,すぐには巧くいかないと思うんで今のままゴリ押しでやれば?」ってちょいと冗談めかして上司とのこの話題は終わらしました.え,ツン?違ぇよ. :DDD

typo修正: THX 2 masayuko :)

2009/11/01

return KTHX;



晒していたNSのebuildが気に入られたらしい.
こう言うのにはやっぱ1337ishにKTHXで応答せねばなるまい. :D

2009/10/25

Rakuten.karma++; /* again */

去年のタダ飯に味をしめて,今年のタダ飯も喰いに行ってきた.

地元が大宮の隣なので会場の品川まで結構時間がかかる.なので,去年の経験を生かして本を持って行く事にした.読んでた本は学生時代に哲学の講義で使っていたカール・R・ポパーの「推測と反駁」.学生の頃は原本を持ってなかったけれど,最近amazonでポチった.が,出掛けに持って行く厚さじゃねぇな,コレは. :D

会場では相変わらず中の人たちがそこら中に立っててカタい感じ.キョドるからあーゆーの苦手なんだよなぁ,俺だけか?あんま勉強会とかイベントとかの経験が豊富な方じゃないけど,技術オタク歓迎の休日のイベントの割にはビジネス(?)な対応すんの面倒臭ぇなぁ,と思う.何時の間にか楽天の中の人になってたカーネル読書会の中の人は今回のプレゼンで「ここの芸風を変える」とか抽象的な事を言っていたけど,こーゆートコは多分変わらんのだろうなぁ,とか思った.blogかなんかで,懇親会で社会人的挨拶をして知り合いを作れみたいな事を言ってた様な気がするし.まぁ,そーゆー雰囲気を意図しているスポンサーなのだろうから,別にわざわざテキトーにやる様に方向転換する必要も無いだろうけど.

誤解の無い様に言っておくと,LTやらパネルディスカッションやらに笑えるネタは結構あったし,スポンサーが企業だから運営側の対応もとても良い.何よりタダ飯を喰わしてくれるのはすばらしい.金がかからないと言う理由ではなくて,この手のイベントでは他に類を見ないほど,驚くくらいゲストに待遇が良い.

仕事も趣味の範囲も全く違う関係でLLはマジメにやってねぇし,サーバの管理なんかしたこともねぇから,Web 2.0な匂いのするイベントの内容を説明するのも何なので,前から感じてたこの辺りの事でも書いてみるか.

この手の技術オタク系イベント(?)には,スポンサーが意図する雰囲気と言うか,やる側が作り出す雰囲気みたいなモノがある,と個人的には思っていたりする.楽天のヤツは金を払って行く技術系セミナーに近い「いらっしゃいませ,本日は御越し頂き,誠にありがとうございます」的な雰囲気.会社でその手の金のかかるセミナーに行っていたり,その延長として参加している様な人達から見れば,こーゆー雰囲気は結構歓迎されるだろうし,学生でこの手のインフラ系(?)を目指している様なsysadminの卵にも好印象だろうと思う,例えイベントのプログラムの半分以上が自社社員のオレオレ発表だったとしても,だ.

でも,ゲストに対する待遇と言う点では楽天のヤツは良い意味で非常に異色だと思う.そしてそう言う雰囲気を期待している人達がテキトーな雰囲気のイベントに来てしまうと,理不尽に気分を害す.「このイベントって来る価値無くね?」みたいに.この傾向はテキトーな雰囲気を期待している俺みたいなイイ加減なヤツが待遇の良さに慣れなくてキョドるみたいなどーでもよろしい症状より深刻だったりする.

ま,端的に言うとそーゆーテキトーな雰囲気のイベントに参加しなくなったり,あからさまに否定したりする訳ですね,ハイ.参加しなくなるだけなら構わねぇんだが,そーゆー人達の一部はテキトーにやられるのが我慢ならんのか,テキトーな雰囲気のイベントそのものをあからさまに否定したりしている.不良社員のオレが言うのも何だか,それこそ人間なってなくね?

テキトーな雰囲気ってのはやる気が無ぇのとは違う.せっかくの休日に地元でない会場までわざわざ出てきていて,イベント前まで何かしら用意しているのが暗にそれを物語っている.展示されたりしている内容が陳腐に見えたり,話している内容が低レベルだと思ったりしたら,間違い無く手前の目と耳が腐ってる.勿論,なんちゃって展示やオレオレ発表みたいなのもあるけど,そりゃあ,ただのネタだろ,懇親会でも参加して話題にでもすればいいじゃねぇか.

ブース内の内輪で盛り上がってるだけ?普段,ネットでユルく繋がってる技術オタク同士がリアルで顔を会わせたらそう言う感じになっても仕方無ぇだろ.テキトーな雰囲気のイベントだと,やる方の目的の半分以上はそれなんだし.そう言う人種に客商売みたいな対人スキルを過度に期待すんなよ.

技術スキルを教えて貰いにイベントに参加している?どんな雰囲気の技術オタク系イベントでも,イベントに参加したくらいでほいほい技術スキルが上がるなら,エンジニアは誰も苦労なんかしてねぇよ.そこで今まで知らなかった事を知ったり出来たら,単に幸運なだけだろ.しかもその幸運も単なるきっかけでしかなくて,マジに知りたかったらあとで自分でゴニョる事が絶対必要だろ.一日ぽっち休日を潰したくらいで技術スキルがぽんぽん上がるとでも思ってんのか?エンジニアの世界,なめてんじゃねぇぞ.もっと楽に稼げる職業にジョブチェンジした方が良いよ,そんなの職業があるのか知らんけど.

マジメにやってるカタいイベントなら,普段聞けない業務のアノネノネみたいな話が聞けるって?そんなことあるかよ,寝言は寝て言えよ.本当にアレな話を公のイベントでマイクに向かって喋る訳ねぇだろ,常識的に考えて.そう言う事はお互いに名前くらいは覚えていて,何度か懇親会とかで一緒にツルめる様になって,かつ酒の所為か何かで口が滑ったらあるかもしれねぇが.

業務上のマズい所や失敗ってのは,普通の技術スキル以上に共有するがとても難しいモノの一つだろ.まさかとは思うが,そーゆーのに興味のある輩で品質管理とか信頼性の本を一冊も読んだ事がないとか言うのは無しだぜ?ちなみにISO 9001の監査とか会社でやったとか,あんなモノはノーカウントだ.あれは大抵の営利企業なら言われなくてもやっている事しか決めてないし,言っちゃあなんだが取得がほぼ形骸化しているから,あっても無くても大した意味なんか無い,と個人的には思っている.「ここで言うのは何なんだけど,実は...」的なマズい所や失敗について知りたいのは未然防止の一部を形成するけれど,本当に一片の野次馬根性も無く,そう言う経験を正当に扱う意図があるのかをもう一度マジメに考えた方が良い.取り敢えず,日科技連の品質管理とか信頼性の本とかを読めば良いよ.変な事を期待してケチつけてんじゃねぇぞ.

まぁ,要するに何が言いたかったのかと言うと,多分,来週のOSCはテキトーな雰囲気の方です.雰囲気が楽天のヤツとちょっと違うだろうけど,「やる方も来る方もせっかく休日を使って来てるんだから,おもしろおかしければそれで良くね?」って事です. :P

2009/10/10

cat $f && sleep 1h ;

今日,10/10は萌の日らしいので,大宮にある猫カフェの猫家でムニョって来た.

夕方だったので,茶々様は寝てた. :DDD

2009/09/12

if (strcmp(to_string(getMIME(&spec)), "text/plain")) { ... }

仕様をtext/plainで渋くキメる. :DDD
AAがポイントだな.書くの結構大変だけどvisioとかsvg系のモノより楽だと思う.
あんまり複雑なのは書けないから,シンプルに仕上げるにはどうしたら良いか考える様になるしな.
あとは全部英語で書ければpure ASCIIで蝶portableなんだが,日本語のUTF-8なのが課題かなぁ.

2009/08/31

MeasureSLOC(&AL9); /* 2009/08 */

AでLで9なdiffstat,8月分.
[diffstat for AL9, for 2009/08.]
 bench/BENCH_BER_IF_REG.vhd    |    4 
bench/BENCH_CLDPCDOP.vhd | 22 +-
bench/BENCH_LDPCDDB.vhd | 25 +-
bench/BENCH_LDPCTX2LDPCRX.vhd | 18 +
bench/BENCH_PE2RST.vhd | 4
bench/BENCH_S2BER_IF.vhd | 4
bench/BENCH_TMCC_DBPSK.vhd | 286 ++++++++++++++++++++++++++
vhdl/BER_IF_REG.vhd | 62 +++++
vhdl/CLDPCDOP.vhd | 31 ++
vhdl/COMMON_TYPE_PKG.vhd | 7
vhdl/COS_VLSX4_MEM.vhd | 15 +
vhdl/FP1_LDPCRX.vhd | 73 +++---
vhdl/FP1_LDPCTX.vhd | 27 +-
vhdl/FP2_LDPCRX.vhd | 61 +++++
vhdl/FP3_LDPCRX.vhd | 12 +
vhdl/FP4_LDPCRX.vhd | 13 +
vhdl/IMUX4SELDPCDIPM.vhd | 453 ++++++++++++++++++++++++++++++++++++++++++
vhdl/PE2RST.vhd | 130 +++++++-----
vhdl/RX_LX_FEBE.vhd | 62 ++++-
vhdl/S2BER_IF.vhd | 8
vhdl/SELDPCDIPM.vhd | 74 ++++++
vhdl/TSR_CLK-iff.vhd | 16 +
vhdl/TSR_CLK.vhd | 17 +
vhdl/UACCUM.vhd | 52 +++-
24 files changed, 1325 insertions(+), 151 deletions(-)
2kSLOC逝ってないNA!!1 :DDD
453SLOCのIMUX4SELDPCDIPMに10000bit以上のテスト用軟判定bitが入っているとか,tricky過ぎるぜ.
一つだけ問題が残っているんだが,そろそろ飽きたので次に逝きたい所だ.
[ZOMG, under 2kSLOC!!1 :DDD
My tricky code does embed over 10000 soft-decision bits for hardware debugging into IMUX4SELDPCDIPM that is only 453 SLOC.
I'm still fighting w/ t3h last issue atm. HOW BOLING!!1]

2009/08/02

MeasureSLOC(&AL9); /* 2009/07 */

AでLで9なdiffstat,7月分.
[diffstat for AL9, for 2009/07.]
 bench/BENCH_AFIFO.vhd         |    6 
bench/BENCH_BER_IF_CLK.vhd | 16
bench/BENCH_CLDPCDOP.vhd | 3
bench/BENCH_EDGE_DELAY.vhd | 67 ++++
bench/BENCH_FCO.vhd | 14
bench/BENCH_HS_BUS.vhd | 33 +-
bench/BENCH_LDPCDDB.vhd | 3
bench/BENCH_LDPCTX2LDPCRX.vhd | 6
bench/BENCH_PE2RST.vhd | 81 +++-
bench/BENCH_SFIFO.vhd | 6
bench/BENCH_TX_SMAP.vhd | 6
bench/BENCH_UDACCUM.vhd | 100 ------
stim/STIM_RX_DATA_CARR.vhd | 10
stim/STIM_TX_DATA_CARR.vhd | 10
vhdl/BER_IF_CLK.vhd | 87 ++---
vhdl/BER_IF_REG.vhd | 120 +++----
vhdl/COS_VLSX4_MEM.vhd | 690 ++++++++++++++++++++++--------------------
vhdl/EDGE_DELAY-stub.vhd | 71 ++++
vhdl/EDGE_DELAY.vhd | 163 +++++++++
vhdl/FP1_LDPCRX.vhd | 81 ++++
vhdl/FP1_LDPCTX.vhd | 49 ++
vhdl/FP2_LDPCRX.vhd | 122 +++++--
vhdl/FP3_LDPCRX.vhd | 15
vhdl/FP4_LDPCRX.vhd | 13
vhdl/HS_BUS.vhd | 72 ++++
vhdl/LDPCD.vhd | 6
vhdl/PE2RST.vhd | 180 +++++++---
vhdl/RX_LX_FEBE.vhd | 100 ++++--
vhdl/S2BER_IF.vhd | 40 --
vhdl/SB_MASTER.vhd | 42 ++
vhdl/TSR_CLK-iff.vhd | 312 ++++++++++++++++++
vhdl/TSR_CLK.vhd | 32 +
vhdl/TX_SX_FEBE.vhd | 42 +-
vhdl/UACCUM.vhd | 224 +++++++++++++
vhdl/UDACCUM.vhd | 270 ----------------
35 files changed, 2029 insertions(+), 1063 deletions(-)
やっぱ,10kSLOC逝ってないZE!!1 :DDD
つーか,実機デバッグの所為で先月は少なすぎだな.
でもコイツももうそろそろ仕上げです. :)
[ZOMG, under 10kSLOC AGAIN!!1 :DDD
B/c I'm really being busy for debugging on real hardware ATM.
So MAH TIME IZ GETTING NEER!!1 :DDD]

2009/07/26

doFlame(&numeric_std);

#vhdlのnumeric_stdな猿共と再度flameしてみた. :P
07/25 21:03:01 hiyuh
hmm
07/25 21:03:31 hiyuh
i did migrate std_logic_arith to numeric_std on my current proj.
07/25 21:04:06 hiyuh
but i think numeric_std still sux in my style/use.
07/25 21:04:49 hiyuh
anybody have good example code which use numeric_std elegant?
07/25 21:04:56 hiyuh
s/use/uses/
07/25 21:06:39 hiyuh
MatthiasM, NULL[0] ^^ :)
07/25 21:06:44 MatthiasM
:)
07/25 21:07:25 MatthiasM
there is not much to say - if you have a signal/variable which is
used in computations, then declare it as (un)signed
07/25 21:07:29 Sordran_
hiyuh:
http://www.dz.ee.ethz.ch/en/information/hdl-help/vhdl-sources.html
07/25 21:12:00 hiyuh
hmm
07/25 22:17:16 bpadalino
hiyuh: yeah, what's the issue ?
07/25 22:21:23 hiyuh
one of issues I hate numeric_std is it breaks port compatibilty.
07/25 22:21:26 hiyuh
b/c all of mine was std_logic, std_logic_vector, range constrained
integer or custom type.
07/25 22:22:22 hiyuh
i know inner std_logic_vector() wrapping makes it compatible,
but it's very eyesore.
07/25 22:24:00 bpadalino
so don't convert to slv at the port level
07/25 22:24:08 bpadalino
if it's an unsigned number - keep it an unsigned number
07/25 22:24:14 bpadalino
preserve context as much as possible
07/25 22:28:13 hiyuh
nope, for lazy simulation, I did input ascending/descending number
to data port. it's data, not unsigned/signed.
07/25 22:31:26 hiyuh
and another one I hate is to declare unsigned/signed signal/variable
and computing w/o unsigned()/signed().
07/25 22:32:21 bpadalino
you can always overload your functions .. and add your own package
07/25 22:33:12 hiyuh
if you recommend overloading, i won't use numeric_std TBH.
07/25 22:33:26 hiyuh
it's pain to me atm.
07/25 22:33:44 bpadalino
numeric_std removes ambiguity from your code - if you find it to
be a pain, then live with the ambiguity
07/25 22:34:40 hiyuh
then plz show me that ambiguity which comes from std_logic_arith?
07/25 22:35:56 bpadalino
a <= b + x"abcd"
07/25 22:35:58 bpadalino
what did i just do
07/25 22:38:27 hiyuh
every time I compute std_logic_vector, I always do it w/ explicit
unsigned()/signed(). and also I don't use hexadecimal/binary
presented std_logic_vector for any computation.
07/25 22:39:45 bpadalino
congrats - but it doesn't remove the ambiguity that can happen
07/25 22:39:47 bpadalino
use whatever you want
07/25 22:41:17 hiyuh
promote me more, why that doesn't remove the ambiguity?
07/25 22:42:45 bpadalino
because you can still abuse it
07/25 22:44:38 hiyuh
hmm
07/25 22:48:17 bpadalino
i understand numeric_std makes your code look "ugly" if you do a
lot of casting
07/25 22:48:47 bpadalino
answer is to do less casting
07/25 22:54:48 hiyuh
I'd like to say trivial explicit casting is not eyesore to me.
07/25 22:54:57 hiyuh
atm i don't like numeric_std's implicit type guessing to compute.
07/25 22:55:02 hiyuh
b/c to see which function is used, it needs to see their
declarations.
07/25 22:55:49 bpadalino
guessing ?
07/25 22:56:39 hiyuh
signal a : signed; signal b : signed; signal c : signed; ... some
line of code ... c <= a + b; -- numeric_std use.
07/25 22:59:10 hiyuh
+ of "a + b" is "signed + signed". but to figure out that, it needs
to see their declaration.
07/25 22:59:40 MatthiasM
the issue why code may look ugly is that it is not cleanly designed -
eg when writing software you have to carefully define the types of
variables, parameters and return values
07/25 23:00:05 bpadalino
how is that not any different than how it would happen with
std_logic_arith ?
07/25 23:01:16 hiyuh
my std_logic_arith use looks like,
07/25 23:01:17 hiyuh
signal a : std_logic_vector; signal b : std_logic_vector; signal
c : std_logic_vector; ... some lines of code ... c <= signed(a)
+ signed(b);
07/25 23:02:00 bpadalino
is a or b or c a signed or unsigned number ?
07/25 23:02:05 bpadalino
wow, that's all sorts of crazy
07/25 23:03:19 bpadalino
nothing stops you from going c <= unsigned(a) + signed(b) ;
07/25 23:03:24 bpadalino
so it's really just a bunch of bits
07/25 23:04:22 hiyuh
I mean arg type and computation is one set.
07/25 23:04:26 hiyuh
signal a : signed; signal b : signed; signal c : signed;
... some line of code ... c <= signed(std_logic_vector(a)) +
unsigned(std_logic_vector(b));
07/25 23:04:41 hiyuh
is it valid for numeric_std?
07/25 23:04:56 bpadalino
yes
07/25 23:05:24 hiyuh
if so, declaration is not for force to use proper computation.
07/25 23:06:07 bpadalino
if i saw unsigned(std_logic_vector(b)) in a code review, i think
my red flags would go up
07/25 23:06:18 bpadalino
but if i saw signed(b) - i wouldn't think twice
07/25 23:06:40 bpadalino
numeric_std doesn't stop you from being an idiot - it just makes
it harder
07/25 23:07:17 hiyuh
yeah
07/25 23:08:33 bpadalino
they're supposed to be a set of functions which help you
07/25 23:08:42 bpadalino
if you don't find them helpful, don't use them
07/25 23:09:22 hiyuh
but if i stick std_logic_arith, MatthiasM will bitch me. :P
07/25 23:09:52 MatthiasM
sure
07/25 23:14:30 bpadalino
so learn to quit writing ambiguous code
07/25 23:16:09 hiyuh
signal a : signed; signal b : signed; signal c : signed; ... some
line of code ... c <= a + b; -- (1)
07/25 23:16:12 hiyuh
signal a : std_logic_vector; signal b : std_logic_vector; signal
c : std_logic_vector; ... some lines of code ... c <= signed(a) +
signed(b); -- (2)
07/25 23:16:54 hiyuh
to review code, (1) needs to check declaration and computation. (2)
needs to check computation only.
07/25 23:17:27 hiyuh
that's why I hate numeric_std atm.
07/25 23:17:30 bpadalino
d <= unsigned(a) + signed(b) ;
07/25 23:17:45 bpadalino
does not enforce that a is a signed type
07/25 23:18:07 bpadalino
if you want to be loose, and not have matthiam bitch at you -
use verilog
07/25 23:18:15 bpadalino
but in a strongly typed language, learn to deal with it
07/25 23:18:17 MatthiasM
hiyuh: with (2) you have to check that a is used in the same way
everywhere
07/25 23:18:52 bpadalino
also - if you pass a out a port as a slv, there is no guarantee it
will be maintained as that representation later on
07/25 23:19:00 bpadalino
which only causes more confusion
07/25 23:19:53 MatthiasM
the only place where you should keep using SLV is at the top level -
because post fitting timing simulation is loosing the port type -
and then your testbench doesn't work anymore :(
07/25 23:20:15 bpadalino
:(
07/25 23:21:16 hiyuh
MatthiasM: (1) is same b/c think that crappy code like,
07/25 23:21:21 hiyuh
signal a : signed; signal b : signed; signal c : signed;
... some line of code ... c <= signed(std_logic_vector(a)) +
unsigned(std_logic_vector(b)); -- (3)
07/25 23:21:39 bpadalino
hiyuh, if you want to shoot yourself in the foot easier, i think
aliases might make your life more hellish
07/25 23:22:03 MatthiasM
hiyuh: if I would have to review your code and it contains such a
thing - you would rewrite it again
07/25 23:27:21 hiyuh
bpadalino: if you declare port as signed/unsigned, it doesn't force
to use that type. b/c there is idiot casts.
07/25 23:27:48 bpadalino
hiyuh, like i said - you can always be an idiot, numeric_std just
makes it harder
07/25 23:28:42 hiyuh
and it does also analyze harder. that's why I hate numeric_std.
07/25 23:30:19 hiyuh
if declaration can not force proper type use, i think type in
declaration is redundant info.
07/25 23:31:24 hiyuh
if using numeric_std doesn't allow any casting, it make sense.
07/25 23:31:36 hiyuh
but it's not.
07/25 23:32:04 MatthiasM
hiyuh: well - do what you want - but spot anoyng everyone with your
bad design
07/25 23:32:11 MatthiasM
*stop
07/25 23:34:27 hiyuh
annoy?
07/25 23:34:29 hiyuh
I'm really talking in technical view.
07/25 23:34:31 bpadalino
you know, no reason to even use std_logic_vectors since we're just
going down to bits ...
07/25 23:34:37 bpadalino
so lets just do std_logic
07/25 23:35:52 bpadalino
hiyuh, you want to be stuck in a type you can't get out of ?
07/25 23:36:05 bpadalino
or would you rather be forced to think about the computation you're
doing ?
07/25 23:46:51 hiyuh
well. you're talking about bit to std_logic migration?
07/25 23:47:12 hiyuh
you mean it's same wrt migration std_logic_arith to numeric_std?
07/25 23:48:09 hiyuh
btw sorry for my bad english.
07/25 23:48:51 bpadalino
i am saying you can use whatever you like - but your arguments
are weak
07/25 23:49:07 hiyuh
hmm
07/25 23:50:02 hiyuh
maybe, it's b/c i have little experience w/ numeric_std.
07/25 23:50:50 hiyuh
so I should read more elegant std_logic_arith to numeric_std
migration examples.
07/25 23:51:08 bpadalino
there's nothing elegant about it
07/25 23:51:26 hiyuh
why?
07/25 23:51:51 bpadalino
the way you're doing it, trust me - there's no elegant way about it
07/25 23:51:59 bpadalino
all your base types are slv ..
07/25 23:52:06 bpadalino
so you will have to cast everything
07/25 23:52:20 bpadalino
first to get to something workable, then back to your slv base type
07/25 23:52:35 bpadalino
you're really doing a lot of work to lose intent and context of
the code
07/25 23:52:54 bpadalino
lets write a c program where all we use are char's .. and cast
everything when we need it to be something else
07/25 23:53:11 hiyuh
nope, I cloned my proj for the migration test. I'm using mercurial.
07/25 23:53:43 bpadalino
scm has nothing to do with elegance or porting poorly written code
to using numeric_std
07/25 23:59:17 hiyuh
well, I've just done to migrate std_logic_arith to numeric_std
already.
07/26 00:00:14 hiyuh
it takes about 1 hour or so. but i think it's ugly.
07/26 00:01:55 hiyuh
to motivate myself more, I'm talking here.
07/26 00:02:54 hiyuh
I beleive my code base is not poor you think.
07/26 00:02:57 hiyuh
it works w/ 2 boards which each one has 4 virtex4.
07/26 00:03:08 hiyuh
all ones are written in two-process method.
07/26 00:08:03 bpadalino
sounds great when you're the only person working on the code
07/26 00:08:04 bpadalino
keep it up
07/26 00:10:08 hiyuh
yup, it was coded by me only.
07/26 00:29:23 bpadalino
if you're the only person, write it any way you want
07/26 00:34:19 hiyuh
ok, thank you for taking your time.

取り敢えず,再確認出来た事としては技術的な話をしている時に"stop annoying"とか"trust me"とかふざけた事を言う奴の意見は聴くに値しないと言う事だな.
結局,suckless.orgのstyle guideが言う様にconsistencyが重要だとすれば,自分のstyleと相容れないpackageを無理に使う事はないって事になるのかな?
つー訳で,やっぱり私は当分の間はnumeric_stdにmigrateする事はありません. :P

2009/07/19

doFlame(&std_logic_arith);

取り敢えず,KMSがmodeset=0で動く様になったと思ったら#vhdlにnumeric_stdな猿が居たのでflameしてみた. :P
07/19 02:35:22 jv
MatthiasM: Why is logic_arith so pervasive?
07/19 02:35:41 MatthiasM
?
07/19 02:46:31 jv
MatthiasM: why people keep using std_logic_artih
07/19 02:46:56 MatthiasM
maybe because neither Xilinx or Altera updated their language
templates

07/19 03:27:50 hiyuh
jv: MatthiasM: promote me numeric_std more. then I'll switch from
sticking std_logic_arith.
07/19 03:28:21 MatthiasM
hiyuh: simple - no help for everyone who uses std_logic_arith :P
07/19 03:28:40 hiyuh
ha
07/19 03:30:21 NULL[0]
we need to open a new channel for that: #vhdl-93
07/19 03:30:55 MatthiasM
or #vhdl-only-for-std_numeric-users
07/19 03:31:12 hiyuh
there is no system doesn't support std_logic_arith and
numeric_std. monkey is just saying "it's t3h standard".
07/19 03:32:05 NULL[0]
a 15 years old tool supporting only vhdl-87 will not support
numeric_std ;p
07/19 03:32:35 hiyuh
no, that kind of craps are not system anymore. :p
07/19 03:36:29 hiyuh
anyway, vhdl-93/2002 doesn't bother to use std_logic_arith, iirc.
07/19 03:36:58 NULL[0]
because it is not necessary anymore
07/19 03:39:00 hiyuh
so plz, promote me in technical view. numeric_std is different from
std_logic_arith. why I should migrate?
07/19 03:39:15 hiyuh
s/I should/should I/
07/19 03:39:50 NULL[0]
one is a standard the other one a de facto standard that will
hopefully be deprecated soon ;)
07/19 03:40:27 NULL[0]
unfortunately it will never happen ;/
07/19 03:41:05 hiyuh
yup, de facto standard won't be deprecated. b/c monky is just saying
"it's t3h standard".
07/19 03:41:20 hiyuh
so plz promote me more.
07/19 03:42:07 NULL[0]
I don't really care :p, I have seen only 1 stupid case combining
std_logic_signed and std_logic_unsigned which broke the code
07/19 03:43:05 NULL[0]
something impossible with numeric_std ;)
07/19 03:43:12 NULL[0]
alone
07/19 03:44:43 hiyuh
std_logic_arith is not std_logic_{signed,unsigned}.
07/19 03:44:45 hiyuh
mixing them does overload some functions in current vhdl standard,
it just makes noobs confuse.
07/19 03:45:17 NULL[0]
std_logic_(un)signed is part of the synopsys libraries like
std_logic_arith
07/19 03:45:50 hiyuh
nope, they are separated, iirc.
07/19 03:46:08 NULL[0]
library IEEE;
07/19 03:46:08 NULL[0]
use IEEE.std_logic_1164.all;
07/19 03:46:08 NULL[0]
use IEEE.std_logic_arith.all;
07/19 03:46:24 NULL[0]
that's the beginning of std_logic_signed
07/19 03:46:37 NULL[0]
-- Copyright (c) 1990, 1991, 1992 by Synopsys, Inc. --
07/19 03:49:10 hiyuh
http://pastebin.com/m545ddbec
07/19 03:49:54 NULL[0]
and ?
07/19 03:51:13 hiyuh
synopsys/std_logic_arith.vhdl has only "use ieee.std_logic_1164.all;"
07/19 03:51:23 hiyuh
so, they are separated.
07/19 03:51:40 NULL[0]
std_logic_(un)signed is a wrapper applied on std_logic_arith
07/19 03:52:43 hiyuh
heh
07/19 03:53:00 hiyuh
but i don't use std_logic_unsigned/std_logic_signed to avoid overload
problem.
07/19 03:54:34 NULL[0]
std_logic_arith and numeric_std have more or less the same
functionalities, so there is no reason to use the library which is
not standard in newer code
07/19 03:55:24 hiyuh
again, plz promote me more.
07/19 03:55:37 hiyuh
in technical view.
07/19 03:56:05 hiyuh
std_logic_arith and numeric_std have more or less the same
functionalities, so there is no reason to migrate the library which
is not de facto standard.
07/19 03:57:09 hiyuh
NULL[0]: so what you said is "in technical"?
07/19 03:57:22 hiyuh
i don't think so.
07/19 03:57:28 MatthiasM
hiyuh: numeric_std has resize
07/19 03:57:51 MatthiasM
and shift_left/right with warnings when the numerical value changed
because of overflow
07/19 03:58:01 hiyuh
heh
07/19 03:58:23 MatthiasM
eg resize(to_unsigned(10, 4), 3) gives a warning in simulation
07/19 03:58:45 MatthiasM
but resize(to_unsigned(10, 5), 4) is ok

07/19 04:02:52 hiyuh
yo, |fred| :)
07/19 04:03:14 |fred|
perfect timing to disappear ;o)
07/19 04:03:22 hiyuh
lol
07/19 04:33:26 |fred|
hiyuh: I have actually right now to follow a guideline forbidding
numeric_std :)
07/19 04:34:00 hiyuh
lol
07/19 04:34:59 hiyuh
k, i'll switch to numeric_std at next proj.
07/19 04:35:01 hiyuh
:D

他人に新しいモノをすすめる時には,trivialでtechnicalな利点を根拠に持たないとダメだと思う.
"it's t3h standard!!1"は"but ITJUSTWORKS(tm)"で一蹴される阿呆に共通する特徴.
んな事を言ったって,我らが仮想敵なボスの無意味に保守的な態度に対向出来る訳無ぇだろよ,カスが.
でも,実を言うとstd_logic_arithに気に入らない所もあるので,今度から numeric_stdを使ってみっかな.
std_logic_arithにしがみついているのは,#vhdlでは少数派の様だし. :P

2009/07/15

migrate2KMS(&nouveau); Firmware.karma--;

nouveauがKMSに移行しろと言うのでゴニョる.
見ての通り大変な事になっとるので,もう少し弄る予定ナリよ. :DDD


一ヶ月程ハマっていた問題の原因らしきモノが発覚.
結論から言うと,on-chip firmwareが腐っている臭い.
取り敢えず,コードに罵詈雑言を埋め込んでおこう. :P

勿論,スタイルはtwo-process手法をベースにmultiple CDCとlegacy/tech-specific blobに対応.
問題は抽象化レベルが高くて理解出来る人が少ない事か?

2009/07/09

addSpice(&OSS, aBUG);


NWCCの中の人とのメールの一部.

バグってんのはバグってんのでおもしろいモノだと思う.
でも,faultless golden codeを書いてやろうとする気概は常に持ちたいもんだ.
特に仕事でコード書いている時は"ぷろふぇっしょなる"として扱われている事を念頭において欲しいよなぁ.

最近,会社でVHDLを教える機会があって,アレなコードを見る度に罵詈雑言(?)を吐く不良社員ぶりを発揮していたのだが,そうやって温室培養し過ぎると,負の遺産であるウンコなコードに耐性が無くなってしまうと言う弱点もある事に気づいた.
大人の事情もあるし,そう言う腐りかけの生ゴミにあんまり手を触れない様に,異臭のするカビがこっちにも移ってしまわない様に,巧く扱う方法も教えていかねばならんね.
なんとこの世は{生,逝}き難い事か!!1 :P

2009/07/03

MeasureSLOC(&AL9); /* 2009/06 */

AでLで9なdiffstat,6月分.
[diffstat for AL9, for 2009/06.]
 bench/BENCH_AFIFO.vhd         |    2 
bench/BENCH_BCMUX.vhd | 2
bench/BENCH_CLDPCDOP.vhd | 9
bench/BENCH_LDPCDDB.vhd | 126 +-
bench/BENCH_LDPCTX.vhd | 720 --------------
bench/BENCH_LDPCTX2LDPCRX.vhd | 1846 +++++++++++++++++++++++++++++++++++++
bench/BENCH_S2BER_IF.vhd | 194 +++
bench/BENCH_SB.vhd | 345 ++++---
bench/BENCH_SFIFO.vhd | 2
bench/BENCH_XQUEUE.vhd | 2
bench/LDPCRX_MEM.vhd | 187 +++
bench/LDPCTX_MEM.vhd | 4
stim/STIM_TX_DATA_CARR.vhd | 2
vhdl/BCBOOL.vhd | 172 +++
vhdl/BCMUX.vhd | 160 +++
vhdl/BER_IF_CLK.vhd | 26
vhdl/BER_IF_REG.vhd | 94 +
vhdl/CLDPCDOP.vhd | 3
vhdl/COS_VLSX4_MEM.vhd | 838 +++++++++++++++++
vhdl/ELDPCDII.vhd | 202 ----
vhdl/ELDPCDIP.vhd | 204 ++++
vhdl/FP1_LDPCRX.vhd | 2004 ++++++++++++++++++++++-------------------
vhdl/FP1_LDPCTX.vhd | 79 +
vhdl/FP2_LDPCRX.vhd | 2052 ++++++++++++++++++++++++------------------
vhdl/FP2_LDPCTX.vhd | 79 +
vhdl/FP3_LDPCRX.vhd | 489 ++++++----
vhdl/FP3_LDPCTX.vhd | 6
vhdl/FP4_LDPCRX.vhd | 471 ++++++---
vhdl/FP4_LDPCTX.vhd | 6
vhdl/HD2BO.vhd | 11
vhdl/LEDIND.vhd | 180 +++
vhdl/LLR2SC.vhd | 31
vhdl/PSQUASH.vhd | 22
vhdl/RX_LX_FEBE.vhd | 92 +
vhdl/S2BER_IF.vhd | 22
vhdl/SBSSBDD.vhd | 19
vhdl/SB_MASTER.vhd | 145 ++
vhdl/SB_SLAVE.vhd | 45
vhdl/SELDPCDIIM.vhd | 571 -----------
vhdl/SELDPCDIPM.vhd | 845 +++++++++++++++++
vhdl/TSR_CLK.vhd | 32
vhdl/TX_SX_FEBE.vhd | 34
vhdl/XDPRAM.vhd | 2
vhdl/XDYNSR.vhd | 2
vhdl/XQUEUE.vhd | 2
vhdl/XSPRAM.vhd | 2
vhdl/XSPSR.vhd | 2
vhdl/XSSSR.vhd | 2
48 files changed, 8288 insertions(+), 4099 deletions(-)

やっぱ,10kSLOC逝ってないZE!!1 :DDD
受信側のtop wrapperをrewriteしたのが一番大変だったかのぅ.
[ZOMG, under 10kSLOC AGAIN!!1 :DDD
Rewriting RX's top wrappers were rather big to me.]

2009/06/19

wmii.karma++; /* Cygwin/X */

Virtex4 LX200 6個分のボードレベルシミュレーション中,暇だったのでテキトーにportingしてたら,なんか動いたらしい. :DDD

2009/06/16

EGIT_TREE="1337" emerge x11-drivers/xf86-video-nouveau

 ボブ「やあ,ジョニー,聞いてくれよ.」
ジョニー「なんだい,ボブ.」
  ボブ「最近,nouveauがGallium3Dな感じでイケてるじゃん.」
ジョニー「mesa/mesaのmasterにも入ったしね.」
  ボブ「そうそう.」
ジョニー「xf86-video-nvも粛正されたらしいって聞いたよ?」
  ボブ「うん,x11 overlayの方は何気にGallium3D capableなんだ.」
ジョニー「へー.」
  ボブ「で,件のgit live ebuildを調子に乗ってガンガンemergeしてたんだけど...」
ジョニー「それで?」
  ボブ「Xが起動しなくなっちゃたんだよ!」
ジョニー「あら,まあ.」
  ボブ「なぁ,どうしたらいい?」
ジョニー「んー,upstream dev的にはgit bisectしろって言いたい所だけど.」
  ボブ「あー,やっぱり?」
ジョニー「今までは動いてたんだよね?」
  ボブ「うん.」
ジョニー「とりあえず,動けばいいの?」
  ボブ「うん.」
ジョニー「DRMとDRIとDDXのどれが壊れたの?」
  ボブ「drm.koとnouveau.koはキチンとmodprobeされてる.dmesgで確認したよ.」
ジョニー「じゃあ,DRMは大丈夫そうだね,mesa/drmは最近更新されてないし.」
  ボブ「DRIならruntimeでswrastにfallbackするはずだから,これは保留だね.」
ジョニー「/var/log/Xorg.0.logは何て言ってるの?」
  ボブ「なんかBIOSがどうのこうのってメッセージを出して死んでるみたい.」
ジョニー「それ,先頭にNOUVEAU([0-9]*)ってのが付いてる?」
  ボブ「うん.」
ジョニー「きみ,ppc32だったね?」
  ボブ「うん,x86が嫌いだからね.」
ジョニー「多分,DDXのnv_bios.cが壊れたんだね.」
  ボブ「そうなの?」
ジョニー「最近,KMSやwfb関連で色々手が入ってるのさ!」
  ボブ「へー.」
ジョニー「勘でbisectするとbad commitはこれかな?」

bios: use image from PRAMIN in preference to PROM on NV50

  ボブ「じゃあ,無難にこの辺りに戻せばいいのかな?」

Add DVI-A output info for Mac card missing bios tables (#21273)

ジョニー「試してみよう.」
  ボブ「どうやるんだい?」
ジョニー「こうさ!」
EGIT_TREE="b7e3306ddc3693699f6f9de7b22913ee22ed31ed" \
emerge --oneshot =x11-drivers/xf86-video-nouveau-9999

  ボブ「なるほど,EGIT_TREEで特定のcommit revisionを指定してあげればいいんだね.」
ジョニー「うん,x11-drivers/xf86-video-nouveauはgit.eclassを使ってるからね.」
  ボブ「と言うか,EGIT_TREEなのにtree revisionじゃだめなの?」
ジョニー「commit revisionじゃなきゃだめだよ」
  ボブ「なんで?」
ジョニー「gitはUIがbad designだからじゃない? 平たく言えば,仕様かな?」
  ボブ「あー,仕様なら仕方ないかー.」

    === emerge実行 & X再起動 ===

  ボブ「おー,ジョニー,動いたよ!」
ジョニー「じゃあ,またricerな生活を満喫出来るね!」
  ボブ「ああ,やっぱりGentooは最高だね!」

# 2009/06/17 ちと修正. :)

2009/06/01

MeasureSLOC(&AL9); /* 2009/05 */

AでLで9なdiffstat,5月分.
[diffstat for AL9, for 2009/05.]
 b/bench/BENCH_CLDPCDOP.vhd      |  364 +++++++++
b/bench/BENCH_LDPCTX.vhd | 720 +++++++++++++++++++
b/bench/LDPCTX_MEM.vhd | 191 +++++
b/bench/MT48LC16M16A2x1.vhd | 234 ++++++
b/stim/STIM_FCOD_DATA.vhd | 217 +++++
b/vhdl/RX_LX_FEBE.vhd | 602 ++++++++++++++++
bench/BENCH_LDPCDDB.vhd | 84 +-
bench/BENCH_LDPCEDB.vhd | 5
bench/BENCH_SB.vhd | 170 +++-
bench/BENCH_TSR_CLK.vhd | 44 -
bench/METABENCH_LDPCDDB.vhd | 58 -
bench/METAMETABENCH_LDPCDDB.vhd | 12
vhdl/CLDPCDOP.vhd | 5
vhdl/CSSSTM.vhd | 3
vhdl/ELDPCDII.vhd | 110 +-
vhdl/FP1_LDPCTX.vhd | 1474 +++++++++++++++++-----------------------
vhdl/FP2_LDPCTX.vhd | 1026 +++++++++++++++------------
vhdl/FP3_LDPCTX.vhd | 130 ++-
vhdl/FP4_LDPCTX.vhd | 132 ++-
vhdl/LDPCD-stub.vhd | 4
vhdl/LDPCD.vhd | 85 +-
vhdl/LDPCE-stub.vhd | 30
vhdl/LDPCE.vhd | 60 +
vhdl/LDPCEDB.vhd | 6
vhdl/PN_BLOB.vhd | 46 -
vhdl/SELDPCDIIM.vhd | 6
vhdl/TSR_CLK.vhd | 149 ++--
vhdl/TX_SRC_MUX.vhd | 7
vhdl/TX_SX_FEBE.vhd | 157 ++--
vhdl/UDACCUM.vhd | 137 ++-
30 files changed, 4485 insertions(+), 1783 deletions(-)
やっぱ,10kSLOC逝ってないNE!!1 :DDD
残るは受信側なのでもう一息.
[ZOMG, under 10kSLOC AGAIN!!1 :DDD
'kay, rest parts I have to code is RX's.]

2009/05/25

downstream = dup(upstream);

s9fesのさきっぽを追っかけてるらしいdebianな人が「オレのとdupってるぜ!!1」とか言うのでその返事.

きっと親切心でメールをくれたんだと思うんだけど,オレはさきっぽを追っかける事自体が目的みたいなもんだからdupしてても一向に構わんのだけどなぁ.
結局upstreamの中の人が気に入ればdownstreamのchangesetはupstreamにmergeされて,結果全てのdownstreamに還元される訳だし,DSCMってそう言う為のモノじゃねぇの?

つーか,なんでみんなgit使ってんだよ!!1 :DDD

Me -= Blood; Me +=Coffee; Me += GyouZa;

高専時代の知り合いから電話があった.
オレと違って大学に編入した後で修士まで行ったらしく,しかもオレの今の仕事の分野に近いトコロをゴニョっていた様で妙に話が合って蝶意外.

が,メインはそっちじゃなくて,高尚なものではないけど抽象的な人生相談(?)の様なモノだった.
例の如く不況の煽りを受けて修士を出てから就職した会社のある部門が無くなるそうで.
「オレはエラくもないし,職は斡旋出来ないぜー」とか言ったら,もう幾つか内定は貰っているが,いい機会だから色々考えたいんだとか.
で,高専時代でもオタク全開だったオレが今は何をやらかしているのかとか聞きたかったらしい.
ふむふむ...ぬるへそ,ぬるへそ...
...って,オタクのまんまに決まってんじゃん,変わりゃしねぇよ. :DDD

つー訳で,オレはヒキコモリなハズなんだが,土日連続で外出すると言う異例の事態に.
駅で待ち合わせをしている間のヒマつぶしに献血して,合流してから"どとぉる"なコーヒーと餃子メインの店のメシをゴチになってきた.
オレの話が参考になったかどうか分からんけど,彼はオレよりずっと英語出来るし,スゲェイケメンなので大丈夫じゃね? :DDD

別れ際,「今度就職祝いしてくれー」とか言ってた.
今日のお返しにメシくらいおごってやるさ.
まぁ,頑張れや. :)

2009/05/23

HikiKomori | ~HikiKomori

会社に案内が来てて,ボスが「暇なら行けば?」みたいな事を言っていたので,俺はひきこもりなはずなんだが,今日はNHK放送研究所の技研公開に行ってきた.
休日なので一般の人が蝶いっぱい.

見栄えのするブツの方に人が集まってたけど,仕事でお手伝いさせてもらったブツの展示をメインに見てきた.
アンテナの受信信号を並列に記録するHDDレコーダのお化けを拵えてリアルタイム復調してた,地味にすげぇ. :DDD

それにしてもあの辺は雰囲気がおしゃれ(?)過ぎて,なんか落ち着かない.
んー,どうしたもんかなぁ.

2009/05/19

USE=-gold emerge sys-devel/binutils

 ボブ「やぁ,ジョニー,聞いてくれよ.」
ジョニー「なんだい,ボブ.」
  ボブ「IUSE=goldなsys-devel/binutilsを見つけたので,chrootもせずにemergeしたんだ.」
ジョニー「へぇ,それはなんともricerらしいじゃないか.」
  ボブ「だけどさ,続いてemergeしようとしたsys-apps/shadowのeconfがコケるんだ.」
ジョニー「それはまたどうして?」
  ボブ「僕も変だなと思って,手元の自分のCのプログラムをコンパイルしてみたんだ.」
ジョニー「それで?」
  ボブ「なんと何もコンパイル出来なくなってたんだよ!」
ジョニー「なんてこった!」
  ボブ「慌ててUSE=-goldでsys-devel/binutilsをemergeしなおそうとしたんだけど.」
ジョニー「ダメだったと.」
  ボブ「そうなんだ.」
ジョニー「なるほど.」
  ボブ「なぁ,ジョニー,どうしたいいと思う?」
ジョニー「そんな時はricerなオレ達の強い味方,tinderbox.dev.gentoo.orgの出番さ.」
  ボブ「何だいそれは?」
ジョニー「systemでstableなブツやクロスコンパイラのバイナリなんかを提供しているトコさ.」
  ボブ「へぇ,普段自前でしかコンパイルしないから知らなかったよ.」
ジョニー「で,コイツをPORTAGE_BINHOSTで指定して-gKでemergeすれば良いんじゃないかな?」
  ボブ「具体的には僕の場合はどうやるんだい?」
ジョニー「君はなぜかppc32だったよね?」
  ボブ「うん,x86が嫌いだからね.」
ジョニー「ならこうさ!」
PORTAGE_BINHOST=http://tinderbox.dev.gentoo.org/default-linux/powerpc/ppc32 \
emerge -gK =sys-devel/binutils-2.18-r3
  ボブ「へぇ,いつもemergeするのとあんまり変わらないね.」
ジョニー「これで少し古いけどsys-devel/binutilsは治ったハズだよ.」
  ボブ「なるほど,これで改めてUSE=-goldでsys-devel/binutilsをemergeすれば良いんだね!」
ジョニー「そうさ,簡単だろ?」
  ボブ「ああ,やっぱりGentooは最高だね!」

2009/05/16

Barcamp.Tokyo[2009] = BenTou + Curry;

waitingだったんだけど,「それでも大丈夫だから来い」みたいなことを言われたのでBarcamp Tokyo 2009に行ってきた.
TLUG並に外国人参加率が高くて,そこら中でネイティブっぽい人達の英語が炸裂してて,俺もPowerBoook弄ってまともに話を聞いていない事も相俟って当社比2倍で訳分からんかった.

あるbrainstormingで「barcampの日本人参加率を上げようぜ」みたいなネタが出て,ありえないぐらいマシンガンかましている人がいたが,正直何を言いたいのかさっぱり聞き取れんかった.
これは新手のプレイだね,間違い無い.

つーか,良く考えたら何で日本人参加率を上げたいんだろう?
彼らが都合の良い英語をプロトコルに使って,実のある話が出来れば日本人参加率が低くても良さそうなもんだけどなぁ.
仮に日本語でのプレゼンやら質疑応答を許可したとしても,そこら中でマシンガンかましているのが大多数だったら,普段英語なんか使う機会が殆ど無い日本人の参加率が上がる訳無ぇだろ,とかここではdisってみる.
少なくとも俺には「郷には入れば郷に従え」ってのが強迫観念みたいに頭から離れんよ.

言い訳しておくと,俺はコードのコメントは悉く英語だし,情報が英語で書かれていても知りたい情報なら読むし,IRCで1337 speakでフザケてたりするけど,耳と口は英語化してないんだよなぁ.
大抵の日本人はコードのコメントは日本語だし,情報が英語で書かれていたら読むのを躊躇うし,IRCで1337 speakなんかしないので,もっと英語化はしていないと思うんよ.

だから,向こうがマシンガンを捨ててカタナに装備を変えるか,こっちがカタナを捨ててマシンガンを装備するかのどちらかをしないと同じ戦場でまともに戦えない.
で,不味い事にマシンガンの方が戦力的に見て圧倒的に有利と言う現状がある訳で,極一部のサムライはカタナを捨ててマシンガンを装備するけど,残りの人達はカタナを持ったまま突撃するか,出島を作って鎖国するか,カタナを捨てて畑を耕してる.

brainstormingは基本的に否定/批判を排したブツだから,その場でどうこうってのはやらなかったし,する気も無かったけど,あそこでマシンガンぶっ放してた人達は最初からマシンガンだけしか装備していなかったとか,ただ単にカタナで斬り合った経験が無いだけだったりしねぇ?
それを一方的に「fair playじゃねぇ!!1」とか言う気は無いし,俺はカタナが結構好きだから別に構わないけど,同じ戦場でまともに戦う事を一番に望んでいるなら,マシンガンをぶっ放してた方はカタナも装備してみようとか,カタナでしか斬り合いした事が無いならマシンガンでもぶっ放してみようとか,っつー言う気概くらいはあっても良いと思うんだよね.

そう言う意味では拙い日本語でコミュニケーションをしようとしてくれるガイジンさんにはとても感謝したいし,俺のbr0ken Englishでも良いなら受け答えしてあげたいと思う.
ま,中々巧く話が進まない所もあってもどかしいけど,だがそれが良い. :)

ああ,そうそう.昼飯の弁当と夕食のカレーはタダ飯だったのでこんなタイトルになってます.深い意味はありません. :DDD

2009/05/15

wm.lineage->next();

graphvizがタルくなったので,inkscapeを乗り換えた.
んで,色着けて線が交わらない様にしてみた. :)
SVGはここに晒しておこう.
[using inkscape instead of graphviz, then colorize and flatten. :)
want SVG? here it is.]

線はそれなりに関連があるって事で,必ずしもforkやrewriteを意味する分けでは無かったりする.
タイル型WMでないモノも入っていたり,そもそもWMじゃないモノも入っているがそれなりに意味がある.
[lines just indicate their relation, not only fork/rewrite.
There is some non-tiling WMs, more over few ones are not WM.
But they're worth to mention for explaining about recent GUI improvement for experienced users.]

あとはmultitalkの資料が間に合うかどうかだな. :p
[hmm, making presentation 2D map by multitalk? oh well. :P]

2009/05/10

TLUG.NomiKai++; synthSound(&hardware);

TLUGに行ってきた.
BarCamp-Tokyo2009の中の人がHypertextについて話してたのと,XMLとSQLの香りがするsemantic webの話だった.
皆さんはレイヤが高いですな,あいかわらず. :)
飲み会/二次会ではshojiさんのSunオフレコ話とかJARIさん(北欧のイケメン)のアレとか色々.

帰ってからmatsuuさんのBarCamp-Tokyo2009用の下ごしらえっぽいモノとして,それっぽいgraphvizな絵をでっち上げた.
多分,もうちっと弄る.


上の絵をでっち上げていたら,#vhdlでhardware sound synthesize野郎が現れていた. :DDD
05/10 03:54:30 mad
I'm planning on making sound generation stuff
05/10 03:56:23 mad
most of that stuff is based around a phase register being incremented
by the frequency on each sound cycle (which is pretty low rate -
typically around 44khz)
05/10 04:02:43 bpadalino
sounds like a cordic should help you out
05/10 04:04:46 hiyuh
cordic is not for making sound, imho.
05/10 04:09:48 hiyuh
that sounds like singletone, variable freq in narrow range, and
presicion is not so important.
05/10 04:10:38 hiyuh
maybe, making rom-based nco is enough to do.
05/10 04:14:39 bpadalino
i don't know if a saw wave would sound very good, but as a phase
accumulator - a cordic sounds like it would work well
05/10 04:30:24 hiyuh
I meant cordic is expensive for that use.
05/10 04:30:29 hiyuh
and saw wave + filter for singletone is not a possibility, anyway.
05/10 04:32:34 hiyuh
phase accum -> sin or cos rom in appropriate precision -> singletone,
it's simple rom-based nco.
05/10 04:40:47 bpadalino
you really think a cordic is that expensive ?
05/10 04:51:49 hiyuh
bpadalino: yes
05/10 04:51:58 bpadalino
interesting
05/10 04:55:54 bpadalino
hiyuh, so if you wanted to create 20 tones, how would you go about
doing that ?
05/10 04:57:07 hiyuh
20 tones in same time?
05/10 04:57:31 bpadalino
yeah
05/10 04:59:05 hiyuh
these tones are elaborate-time fixed or run-time fixed?
05/10 05:00:05 hiyuh
I meant these tones are fixed before logic synthesize, or not.
05/10 05:00:29 bpadalino
runtime fixed tones .. frequency fixed before synthesis, but phase
programmable ..
05/10 05:00:44 bpadalino
and i want the sum of the 20 tones on the output
05/10 05:07:54 hiyuh
you mean "amplitude * (sin(2*pi*f1*t + theta1(t)) + ... sin(2*pi*f20*t
+ theta20(t)))"?
05/10 05:09:10 bpadalino
yeah
05/10 05:10:53 hiyuh
if I were you, I'd like to make semi-fixed digital filter or just
do IFFT.
05/10 05:12:42 bpadalino
that's what i had figured before, but i was just curious what someone
else might have thought
05/10 05:13:00 hiyuh
heh
05/10 05:14:18 bpadalino
i would like to do my own generic systolic FFT sometime ... i think
that might be fun
05/10 05:16:23 mad
the tones parameters are written to at performance time
05/10 05:18:05 mad
It's for music generation, so the applicable freqs are about 20hz to
20khz (although tones over something like 4khz aren't particularly
musical)
05/10 05:19:17 anonissimus
mad: but as harmonics they are
05/10 05:19:33 mad
Precision has to be at least 1%, esp. in the "most common range"
(around 50hz ~ 1000hz)
05/10 05:19:50 mad
anonissimus: yeah, but those are generated from another process
05/10 05:21:16 anonissimus
ah
05/10 05:21:38 anonissimus
know more on music than on generting it with hardware :)
05/10 05:21:57 mad
My plan is: start with pure phase accumulator, then twist the phase
around in a couple of functions (incl. one that uses multiplication),
then use sine wave/funky waveform LUT, apply volume and panning,
sum the channels together, DAC
05/10 05:24:12 mad
Uses about 140 bits of registers per channel
05/10 05:27:44 mad
A real practical design would actually be sample based instead
(with samples in RAM)
05/10 05:29:23 hiyuh
you know, your plan violates my assumption that described in the
above expr.
05/10 05:29:25 hiyuh
so what I was saying is not good way for you.
05/10 05:29:59 mad
mm, right
05/10 05:31:35 mad
sound synthesis isn't so hard because the sampling rate is low
anyways... and you can do it well in software if you have enough CPU
05/10 05:32:14 hiyuh
yeah, that's why soft synth is popular atm.
05/10 05:32:40 mad
no kidding, since it pretty much solves it
つまり,敢えてsoftware sound synthesizeしないっつーことですか?
そいつは物好きだなぁ. :)

2009/05/01

MeasureSLOC(&AL9); /* 2009/04 */

AでLで9なdiffstat,4月分.
[diffstat for AL9, for 2009/04.]
 a/bench/BENCH_NARROWER.vhd      |  148 -------
a/vhdl/CPUMP.vhd | 275 --------------
a/vhdl/NARROWER.vhd | 418 ----------------------
a/vhdl/WIDER.vhd | 350 ------------------
b/bench/BENCH_HS_BUS.vhd | 105 +++++
b/bench/BENCH_SB.vhd | 218 +++++++++++
b/bench/BENCH_UDACCUM.vhd | 100 +++++
b/vhdl/HS_BUS.vhd | 328 +++++++++++++++++
b/vhdl/SB_MASTER.vhd | 629 +++++++++++++++++++++++++++++++++
b/vhdl/SB_SLAVE.vhd | 339 ++++++++++++++++++
b/vhdl/TX_SRC_MUX.vhd | 180 +++++++++
b/vhdl/TX_SX_FEBE.vhd | 338 ++++++++++++++++++
b/vhdl/UDACCUM.vhd | 219 +++++++++++
bench/BENCH_BCMUX.vhd | 7
bench/BENCH_BER_IF_REG.vhd | 92 ++--
bench/BENCH_LDPCDDB.vhd | 471 +++++++++++++++----------
bench/BENCH_LDPCEDB.vhd | 398 ++++++---------------
bench/BENCH_PE2RST.vhd | 49 +-
bench/BENCH_TX_SMAP.vhd | 43 +-
bench/METABENCH_LDPCDDB.vhd | 161 ++------
bench/METABENCH_LDPCEDB.vhd | 140 ++-----
bench/METAMETABENCH_LDPCDDB.vhd | 104 +++++
bench/METAMETABENCH_LDPCEDB.vhd | 4
stim/STIM_PN_DATA.vhd | 156 +++++++-
stim/STIM_RX_DATA_CARR.vhd | 139 ++++++-
stim/STIM_TX_DATA_CARR.vhd | 135 ++++++-
vhdl/AFIFO.vhd | 30 +
vhdl/BER_IF_REG.vhd | 743 ++++++++++++++++++++--------------------
vhdl/CLDPCDOP.vhd | 11
vhdl/COMMON_TYPE_PKG.vhd | 7
vhdl/DFE_NEGOTIATE.vhd | 282 ++++++++++-----
vhdl/ELDPCDII.vhd | 21 -
vhdl/FCOD.vhd | 24 -
vhdl/HD2BO.vhd | 123 +++---
vhdl/LDPCD.vhd | 35 -
vhdl/LDPCE.vhd | 41 +-
vhdl/LDPCEDB.vhd | 30 +
vhdl/LLR2SC.vhd | 57 ++-
vhdl/PE2RST.vhd | 310 +++++++++++-----
vhdl/PN_BLOB.vhd | 89 +---
vhdl/PN_NEGOTIATE.vhd | 274 ++++++++++----
vhdl/PSQUASH.vhd | 72 ++-
vhdl/S2BER_IF.vhd | 66 +--
vhdl/SB2SSB.vhd | 83 +++-
vhdl/SBSSBDD.vhd | 8
vhdl/SFIFO.vhd | 16
vhdl/VTQUEUE.vhd | 4
47 files changed, 4939 insertions(+), 2933 deletions(-)
やっぱ,10kSLOC逝ってないYO!!1 :DDD
[ZOMG, under 10kSLOC AGAIN!!1 :DDD]

VHDL -= function; VHDL -= procedure;

#vhdlにて,functionもprocedureもいらねぇだろうと寝言を言う野郎が出現.
[At #vhdl, t3h guy shoutz "no function and no procedure FTW!!1". So I'd have to say WTF.]
04/30 20:42:47 algoboy
i need to create a load register, that load the value on a load
signal, should the register be combinational or clocked? It has to
hold the loaded values on the output until new values are loaded.
04/30 22:31:38 hw__
I've been told that everywhere I call a function, the function is
replaced by logic. So when I call 5 times a function I've 5 times
the same logic in my FPGA. How about procedures? Does it depend on
the class of formal/actual parameter?
04/30 23:51:23 algoboy
hw__ : it depends on where you are calling the functions. If you
write code that describes a circuit to do 5xtimes your function in
one clock cycle then it will generate 5 times the hardware. But if
you instead create a FSM and call the same function from 5 different
states it should be synthesized to 1 function hardware, depending
on if the synthesizing tool can schedule the operation and reuse
the same hardware.
04/30 23:54:05 algoboy
also the difference between a procedure and a function is that
functions have a return value, procedures don't.
04/30 23:55:30 hw__
algoboy: procedures can have "results" as well: If you use "inout"
or "out" for parameter mode
04/30 23:57:38 algoboy
yes, but i was just telling the difference between a procedure and
function. a procedure doesn't return a value. The same as a void
function in c/c++.
04/30 23:57:57 hiyuh
no
04/30 23:58:47 algoboy
no???
05/01 00:03:42 hiyuh
procedure is procedure. function is function. not less, not more.
05/01 00:03:50 hiyuh
if you really want to know what they are, read VHDL LRM or general
CS book like MIT SICP.
05/01 00:08:56 algoboy
yes a procedure is a procedure and a function is a function. I was
just telling the difference between them. You can always transform
a procedure to a function and a function to a procedure.
05/01 00:10:58 algoboy
I don't see any benefit of using procedures and functions in VHDL. If
you wan to create a "function" in VHDL create a circuit instead,
sequential or combinational. This is a much better approach.
05/01 00:12:29 hiyuh
whut?
05/01 00:13:14 hiyuh
then, haven't you ever read the two-process method paper?
05/01 00:14:58 NULL[0]
algoboy: are you a troll ?
05/01 00:15:47 hiyuh
NULL[0]: i dont think so. :)
05/01 00:16:47 NULL[0]
hiyuh: if you read his question, and the comments he made, I would
not be surprised
05/01 00:17:16 longcat
meh
05/01 00:18:28 algoboy
hiyuh: Gaisler's two process method?? What does that have to do with
procedures and functions.
05/01 00:19:00 hiyuh
algoboy: yup.
05/01 00:19:33 algoboy
yes i have, i uses the two process method almost all the time. But
i never use functions and procedures. So i don't get your question.
05/01 00:20:49 hiyuh
well, are you codin' vhdl as daily job, or?
05/01 00:21:18 algoboy
no
05/01 00:21:53 algoboy
i'm still a student
05/01 00:23:53 hiyuh
okay, I got it, you should code more to realize why function/procedure
are.
05/01 00:23:58 hiyuh
I'm always codin' vhdl as daily job. no function/procedure is
nightmare for me.
05/01 00:26:15 algoboy
The only benefit i could think of is if you create your own library
so that you can reuse.
05/01 00:31:21 hiyuh
what you're saying looks like "always code by using machine language
in HEX editor" to me.
05/01 00:31:27 hiyuh
or, sounds like "paste same code from existing ones, b/c I don't
like any abstraction."
05/01 00:33:04 drichards
isn't abstraction the whole point of an HDL?
05/01 00:33:37 MatthiasM
I use functions for simple things - like counting leading zeros etc
05/01 00:34:06 algoboy
VHDL is not a programming language so i wouldn't write any machine
code. I use VHDL to describe hardware and and prefer to work on the
RTL level.
05/01 00:34:27 MatthiasM
or procedures for updating more complex counters like this: lsb <=
(lsb + inc) mod X; msb <= msb + (lsb + inc) / X;
05/01 00:35:06 *
hiyuh lolz @ "VHDL is not a programming language"
05/01 00:35:15 MatthiasM
functions are much more flexible as you can decide where to store
the return value when you call it (or use it directly in an IF)
05/01 00:35:51 algoboy
hiyuh: :/
05/01 00:35:59 MatthiasM
procedures can have more then one return value - but you must decide
if the values are passed/returned as signal or variable
05/01 00:36:43 MatthiasM
all functions and procedures are basicly combinatorical logic -
if you need something with a clock - write a new entity
05/01 00:37:22 algoboy
MatthiasM: so why not write combinatorial logic all the time?
05/01 00:37:35 MatthiasM
algoboy: LOL
05/01 00:37:50 algoboy
MatthiasM: instead of a function or procedure
05/01 00:38:29 MatthiasM
the example of the procedure above - is about ~10 lines of code -
I need it in 4 places - calling it takes 1 line of code
05/01 00:38:45 MatthiasM
and it even works when the bit width of the busses are different
for each call
05/01 00:39:42 drichards
which is why I like subprogs
05/01 00:39:55 algoboy
MatthiasM: create the same procedure as a circuit. Use generate to
generate x instances and also use genric.
05/01 00:39:55 drichards
they can react to the act bus width, register width, etc.
05/01 00:39:58 algoboy
the same thing
05/01 00:40:57 MatthiasM
algoboy: I can call a function/procedure inside a clocked process
and inside nested control edges - this makes it very easy to write
complex logic with sequential source code
05/01 00:41:34 MatthiasM
as a designer I want to write code that is A) easy to write B)
easy to read C) easy to change
05/01 00:41:56 MatthiasM
and it's the tools job to create an efficient logic implementation
based on my source code
05/01 00:43:10 MatthiasM
ofcourse you have to be careful to not create to wide logic functions
- which can easily happen if you nest IFs - or check the result of
combinatorical functions (like "IF x+1 == y THEN .... END IF;")
05/01 00:43:43 MatthiasM
algoboy: if you understand these - then you can create a complex
design in a short time
05/01 00:43:51 algoboy
MatthiasM: i prefere to write synthesizable code, targeting low power,
low area. Using higher abstraction you rely much on the synthesizing
tool to do the job for you.
05/01 00:44:10 NULL[0]
...
05/01 00:44:32 MatthiasM
yep - that's why I use Quartus - it's synthesizer is very good -
it's very hard to create more efficient logic by hand
05/01 00:45:54 algoboy
oh, fpga synthesizing is one thing, but i am running asic flow and
it is a huge difference.
05/01 00:46:19 tzanger
MatthiasM: quartus is for atmel, right?
05/01 00:46:27 MatthiasM
Altera
05/01 00:46:30 algoboy
yes
05/01 00:46:35 algoboy
altera
05/01 00:47:32 tzanger
er altera
05/01 00:47:33 tzanger
duh
05/01 00:47:41 tzanger
I knew it was an A. :-)
05/01 00:47:47 algoboy
:p
05/01 00:47:49 *
hiyuh petz NULL[0]. :)
05/01 00:48:09 MatthiasM
algoboy: take a look at some old code: http://pastebin.com/d418ebc0e
05/01 00:49:10 MatthiasM
the production code uses constants instead of hard coded values
ofcourse
05/01 00:52:14 algoboy
MatthiasM: VGA controller?
05/01 00:52:25 MatthiasM
sync generator for DVI
05/01 00:52:34 MatthiasM
(VGA doesn't use DE signal)
05/01 00:52:52 algoboy
oh :)
05/01 00:53:17 MatthiasM
but it started as VGA generator - that's why the clock is called
vga_clk
05/01 00:53:41 hiyuh
rename FTW!!1 :)
05/01 00:54:15 MatthiasM
algoboy: see the splitted counter in line 28 and the compare in line
35 ? the current code uses procedures for increment and a function
for compare
05/01 00:54:20 algoboy
MatthiasM: that is nice code :) no functions or procedures :)
05/01 00:54:45 MatthiasM
that way I can just write "IF compare(row_cnt2, row_cnt1, 12, 805)
then .... end if;"
05/01 00:56:28 MatthiasM
algoboy: eg http://pastebin.com/d7c8c5b34
05/01 00:56:41 MatthiasM
much more readable
05/01 00:57:52 algoboy
yes it is, if you know what the functions does.
05/01 00:58:18 MatthiasM
that's why you can put comments into the VHDL files
05/01 01:00:08 algoboy
:p
05/01 01:00:24 *
hiyuh sticks more popcorn to the microwave.
05/01 01:00:40 *
MatthiasM steals hiyuh's popcorn
05/01 01:01:00 hiyuh
lol
05/01 01:01:16 MatthiasM
:DD
ポップコーンを喰えたので良しとする. :DDD
[PLESIOUS POPCORN TIME, YUM!!1 :DDD]

2009/04/11

updateCRC(&CRC, &byte);

ちとCRCをムニャる必要が出て来たので,例の本をゴニョると,byte streamに対して計算するアルゴリズムが載っていたので,2時間くらいモニョモニョしてVHDLで実装した.

先ず,popularな生成多項式をWikipediaからパクってきてpackageに.
library ieee;
use ieee.std_logic_1164.all;

package CRC_GENERATOR_PKG is

constant cCRC_1_GENERATOR : std_logic_vector;
constant cCRC_4_ITU_GENERATOR : std_logic_vector;
constant cCRC_5_ITU_GENERATOR : std_logic_vector;
constant cCRC_5_USB_GENERATOR : std_logic_vector;
constant cCRC_6_ITU_GENERATOR : std_logic_vector;
constant cCRC_7_GENERATOR : std_logic_vector;
constant cCRC_8_ATM_GENERATOR : std_logic_vector;
constant cCRC_8_CCITT_GENERATOR : std_logic_vector;
constant cCRC_8_Dallas_Maxim_GENERATOR : std_logic_vector;
constant cCRC_8_GENERATOR : std_logic_vector;
constant cCRC_8_SAE_J1850_GENERATOR : std_logic_vector;
constant cCRC_10_GENERATOR : std_logic_vector;
constant cCRC_11_GENERATOR : std_logic_vector;
constant cCRC_12_GENERATOR : std_logic_vector;
constant cCRC_15_CAN_GENERATOR : std_logic_vector;
constant cCRC_16_CCITT_GENERATOR : std_logic_vector;
constant cCRC_16_DNP_GENERATOR : std_logic_vector;
constant cCRC_16_IBM_GENERATOR : std_logic_vector;
constant cCRC_24_Radix_64_GENERATOR : std_logic_vector;
constant cCRC_30_GENERATOR : std_logic_vector;
constant cCRC_32_IEEE_802_3_GENERATOR : std_logic_vector;
constant cCRC_32_Castagnoli_GENERATOR : std_logic_vector;
constant cCRC_32_Koopman_GENERATOR : std_logic_vector;
constant cCRC_64_ISO_3309_GENERATOR : std_logic_vector;
constant cCRC_64_ECMA_182_GENERATOR : std_logic_vector;

end package CRC_GENERATOR_PKG;

package body CRC_GENERATOR_PKG is

type tCRC_TYPE is (
CRC_1,
CRC_4_ITU,
CRC_5_ITU,
CRC_5_USB,
CRC_6_ITU,
CRC_7,
CRC_8_ATM,
CRC_8_CCITT,
CRC_8_Dallas_Maxim,
CRC_8,
CRC_8_SAE_J1850,
CRC_10,
CRC_11,
CRC_12,
CRC_15_CAN,
CRC_16_CCITT,
CRC_16_DNP,
CRC_16_IBM,
CRC_24_Radix_64,
CRC_30,
CRC_32_IEEE_802_3,
CRC_32_Castagnoli,
CRC_32_Koopman,
CRC_64_ISO_3309,
CRC_64_ECMA_182
);

type tCRC_LENGTH is array (tCRC_TYPE) of integer range 1 to 64;
constant cCRC_LENGTH : tCRC_LENGTH := (
CRC_1 => 1,
CRC_4_ITU => 4,
CRC_5_ITU => 5,
CRC_5_USB => 5,
CRC_6_ITU => 6,
CRC_7 => 7,
CRC_8_ATM => 8,
CRC_8_CCITT => 8,
CRC_8_Dallas_Maxim => 8,
CRC_8 => 8,
CRC_8_SAE_J1850 => 8,
CRC_10 => 10,
CRC_11 => 11,
CRC_12 => 12,
CRC_15_CAN => 15,
CRC_16_CCITT => 16,
CRC_16_DNP => 16,
CRC_16_IBM => 16,
CRC_24_Radix_64 => 24,
CRC_30 => 30,
CRC_32_IEEE_802_3 => 32,
CRC_32_Castagnoli => 32,
CRC_32_Koopman => 32,
CRC_64_ISO_3309 => 64,
CRC_64_ECMA_182 => 64
);

type tCRC_GENERATOR is array (tCRC_TYPE) of std_logic_vector(64 downto 0);
constant cCRC_GENERATOR : tCRC_GENERATOR := (
CRC_1 =>
-- x^1 + x^0
(64 downto 1+1 => '0') & "11",
CRC_4_ITU =>
-- x^4 + x^1 + x^0
(64 downto 4+1 => '0') & "10011",
CRC_5_ITU =>
-- x^5 + x^4 + x^2 + x^0
(64 downto 5+1 => '0') & "110101",
CRC_5_USB =>
-- x^5 + x^2 + x^0
(64 downto 5+1 => '0') & "100101",
CRC_6_ITU =>
-- x^6 + x^1 + x^0
(64 downto 6+1 => '0') & "1000011",
CRC_7 =>
-- x^7 + x^3 + x^0
(64 downto 7+1 => '0') & "10001001",
CRC_8_ATM =>
-- x^8 + x^2 + x^1 + x^0
(64 downto 8+1 => '0') & "100000111",
CRC_8_CCITT =>
-- x^8 + x^7 + x^3 + x^2 + x^0
(64 downto 8+1 => '0') & "110001101",
CRC_8_Dallas_Maxim =>
-- x^8 + x^5 + x^4 + x^0
(64 downto 8+1 => '0') & "100110001",
CRC_8 =>
-- x^8 + x^7 + x^6 + x^4 + x^2 + x^0
(64 downto 8+1 => '0') & "111010101",
CRC_8_SAE_J1850 =>
-- x^8 + x^4 + x^3 + x^2 + x^0
(64 downto 8+1 => '0') & "100011101",
CRC_10 =>
-- x^10 + x^9 + x^5 + x^4 + x^1 + x^0
(64 downto 10+1 => '0') & "11000110011",
CRC_11 =>
-- x^11 + x^9 + x^8 + x^7 + x^2 + x^0
(64 downto 11+1 => '0') & "101110000101",
CRC_12 =>
-- x^12 + x^11 + x^3 + x^2 + x^1 + x^0
(64 downto 12+1 => '0') & "1100000001111",
CRC_15_CAN =>
-- x^15 + x^14 + x^10 + x^8 + x^7 + x^4 + x^3 + x^0
(64 downto 15+1 => '0') & "1100010110011001",
CRC_16_CCITT =>
-- x^16 + x^12 + x^5 + x^0
(64 downto 16+1 => '0') & "10001000000100001",
CRC_16_DNP =>
-- x^16 + x^13 + x^12 + x^11 + x^10 + x^8 + x^6 + x^5 + x^2 + x^0
(64 downto 16+1 => '0') & "10011110101100101",
CRC_16_IBM =>
-- x^16 + x^15 + x^2 + x^0
(64 downto 16+1 => '0') & "11000000000000101",
CRC_24_Radix_64 =>
-- x^24 + x^23 + x^18 + x^17 + x^14 + x^11 + x^10 + x^7 + x^6 + x^5
-- + x^4 + x^3 + x^1 + x^0
(64 downto 24+1 => '0') & "1100001100100110011111011",
CRC_30 =>
-- x^30 + x^29 + x^21 + x^20 + x^15 + x^13 + x^12 + x^11 + x^8 + x^7
-- + x^6 + x^2 + x^1 + x^0
(64 downto 30+1 => '0') & "1100000001100001011100111000111",
CRC_32_IEEE_802_3 =>
-- x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7
-- + x^5 + x^4 + x^2 + x^1 + x^0
(64 downto 32+1 => '0') & "100000100110000010001110110110111",
CRC_32_Castagnoli =>
-- x^32 + x^28 + x^27 + x^26 + x^25 + x^23 + x^22 + x^20 + x^19 + x^18
-- + x^14 + x^13 + x^11 + x^10 + x^9 + x^8 + x^6 + x^0
(64 downto 32+1 => '0') & "100011110110111000110111101000001",
CRC_32_Koopman =>
-- x^32 + x^30 + x^29 + x^28 + x^26 + x^20 + x^19 + x^17 + x^16 + x^15
-- + x^11 + x^10 + x^7 + x^6 + x^4 + x^2 + x^1 + x^0
(64 downto 32+1 => '0') & "101110100000110111000110011010111",
CRC_64_ISO_3309 =>
-- x^64 + x^4 + x^3 + x^1 + x^0
"10000000000000000000000000000000000000000000000000000000000011011",
CRC_64_ECMA_182 =>
-- x^64 + x^62 + x^57 + x^55 + x^54 + x^53 + x^52 + x^47 + x^46 + x^45
-- + x^40 + x^39 + x^38 + x^37 + x^35 + x^33 + x^32 + x^31 + x^29
-- + x^27 + x^24 + x^23 + x^22 + x^21 + x^19 + x^17 + x^13 + x^12
-- + x^10 + x^9 + x^7 + x^4 + x^1 + x^0
"10100001011110000111000011110101110101001111010100011011010010011"
);

constant cCRC_1_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_1 )(cCRC_LENGTH(CRC_1 ) downto 0);
constant cCRC_4_ITU_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_4_ITU )(cCRC_LENGTH(CRC_4_ITU ) downto 0);
constant cCRC_5_ITU_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_5_ITU )(cCRC_LENGTH(CRC_5_ITU ) downto 0);
constant cCRC_5_USB_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_5_USB )(cCRC_LENGTH(CRC_5_USB ) downto 0);
constant cCRC_6_ITU_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_6_ITU )(cCRC_LENGTH(CRC_6_ITU ) downto 0);
constant cCRC_7_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_7 )(cCRC_LENGTH(CRC_7 ) downto 0);
constant cCRC_8_ATM_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_8_ATM )(cCRC_LENGTH(CRC_8_ATM ) downto 0);
constant cCRC_8_CCITT_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_8_CCITT )(cCRC_LENGTH(CRC_8_CCITT ) downto 0);
constant cCRC_8_Dallas_Maxim_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_8_Dallas_Maxim)(cCRC_LENGTH(CRC_8_Dallas_Maxim) downto 0);
constant cCRC_8_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_8 )(cCRC_LENGTH(CRC_8 ) downto 0);
constant cCRC_8_SAE_J1850_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_8_SAE_J1850 )(cCRC_LENGTH(CRC_8_SAE_J1850 ) downto 0);
constant cCRC_10_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_10 )(cCRC_LENGTH(CRC_10 ) downto 0);
constant cCRC_11_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_11 )(cCRC_LENGTH(CRC_11 ) downto 0);
constant cCRC_12_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_12 )(cCRC_LENGTH(CRC_12 ) downto 0);
constant cCRC_15_CAN_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_15_CAN )(cCRC_LENGTH(CRC_15_CAN ) downto 0);
constant cCRC_16_CCITT_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_16_CCITT )(cCRC_LENGTH(CRC_16_CCITT ) downto 0);
constant cCRC_16_DNP_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_16_DNP )(cCRC_LENGTH(CRC_16_DNP ) downto 0);
constant cCRC_16_IBM_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_16_IBM )(cCRC_LENGTH(CRC_16_IBM ) downto 0);
constant cCRC_24_Radix_64_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_24_Radix_64 )(cCRC_LENGTH(CRC_24_Radix_64 ) downto 0);
constant cCRC_30_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_30 )(cCRC_LENGTH(CRC_30 ) downto 0);
constant cCRC_32_IEEE_802_3_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_32_IEEE_802_3 )(cCRC_LENGTH(CRC_32_IEEE_802_3 ) downto 0);
constant cCRC_32_Castagnoli_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_32_Castagnoli )(cCRC_LENGTH(CRC_32_Castagnoli ) downto 0);
constant cCRC_32_Koopman_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_32_Koopman )(cCRC_LENGTH(CRC_32_Koopman ) downto 0);
constant cCRC_64_ISO_3309_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_64_ISO_3309 )(cCRC_LENGTH(CRC_64_ISO_3309 ) downto 0);
constant cCRC_64_ECMA_182_GENERATOR : std_logic_vector := cCRC_GENERATOR(CRC_64_ECMA_182 )(cCRC_LENGTH(CRC_64_ECMA_182 ) downto 0);

end package body CRC_GENERATOR_PKG;

次に,生成多項式とbit per byteをgenericで指定して,例のアルゴリズムをそのままtwo-process手法で実装.
library ieee;
use ieee.std_logic_1164.all;
use work.CRC_GENERATOR_PKG.all;

package BYTE_CRC_PKG is

component BYTE_CRC is
generic (
BPB : integer range 1 to integer'high := 8;
GENERATOR : std_logic_vector := cCRC_16_CCITT_GENERATOR;
ASYNC : boolean := false
);
port (
iCLK : in std_logic;
iCLR : in std_logic;
iINI : in std_logic;
iE : in std_logic;
iD : in std_logic_vector( BPB-1 downto 0);
oE : out std_logic;
oD : out std_logic_vector( BPB-1 downto 0);
oCRC : out std_logic_vector((GENERATOR'length-1)-1 downto 0)
);
end component BYTE_CRC;

end package BYTE_CRC_PKG;

package body BYTE_CRC_PKG is

-- NOTE: This body should keep to be empty to stub.

end package body BYTE_CRC_PKG;

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use work.CRC_GENERATOR_PKG.all;

entity BYTE_CRC is
generic (
BPB : integer range 1 to integer'high := 8;
GENERATOR : std_logic_vector := cCRC_16_CCITT_GENERATOR;
ASYNC : boolean := false
);
port (
iCLK : in std_logic;
iCLR : in std_logic;
iINI : in std_logic;
iE : in std_logic;
iD : in std_logic_vector( BPB-1 downto 0);
oE : out std_logic;
oD : out std_logic_vector( BPB-1 downto 0);
oCRC : out std_logic_vector((GENERATOR'length-1)-1 downto 0)
);
begin
A_BPB_CHECK : assert ((GENERATOR'length-1) mod BPB = 0)
report BYTE_CRC'instance_name &
"GENERATOR'length-1 should be congrunet to 0 modulo BPB!!1"
severity error;
end entity BYTE_CRC;

architecture TP of BYTE_CRC is

pure function fLEAD_BIT_INDEX (
iX : std_logic_vector
) return integer is
begin
F_L : for l in iX'range loop
if (iX(l) = '1') then
return l;
end if;
end loop F_L;
return -1;
end function fLEAD_BIT_INDEX;

type tCRC_REMAINDER is
array (0 to 2**BPB-1) of
std_logic_vector((GENERATOR'length-1)-1 downto 0);

pure function fCRC_REMAINDER (
iG : std_logic_vector
) return tCRC_REMAINDER is
variable vLG : integer range -1 to iG'length-1;
variable vQ : std_logic_vector(BPB-1 downto 0);
variable vR : std_logic_vector(vQ'length+(iG'length-1)-1 downto 0);
variable vLR : integer range -1 to vR'length-1;
variable vG : std_logic_vector(vR'range);
variable vCRC_REMAINDER : tCRC_REMAINDER;
begin
vLG := fLEAD_BIT_INDEX(iG);
F_Q : for Q in 0 to 2**vQ'length-1 loop
vQ := conv_std_logic_vector(Q, vQ'length);
vR := vQ & ((iG'length-1)-1 downto 0 => '0');
vLR := fLEAD_BIT_INDEX(vR);
W_R : while (vLR >= vLG) loop
vG :=
(vG'length-1 downto vLR+1 => '0') &
iG(vLG downto 0) &
(vLR-vLG-1 downto 0 => '0');
vR := vR xor vG;
vLR := fLEAD_BIT_INDEX(vR);
end loop W_R;
-- synthesis translate_off
A_CRC_REMAINDER_CHECK :
assert (vR(vR'length-1 downto iG'length-1) =
(vR'length-1 downto iG'length-1 => '0'))
report fCRC_REMAINDER'instance_name &
"CRC remainder is out of range!!1"
severity error;
-- synthesis translate_on
vCRC_REMAINDER(Q) := vR((iG'length-1)-1 downto 0);
end loop F_Q;
return vCRC_REMAINDER;
end function fCRC_REMAINDER;

constant cCRC_REMAINDER : tCRC_REMAINDER := fCRC_REMAINDER(GENERATOR);

type tCRC is
array (((GENERATOR'length-1)/BPB)-1 downto 0) of
std_logic_vector(BPB-1 downto 0);

type t is record
E : std_logic;
D : std_logic_vector(BPB-1 downto 0);
RI : std_logic_vector(BPB-1 downto 0);
CRC : tCRC;
end record t;

constant c : t := (
E => '0',
D => (BPB-1 downto 0 => '0'),
RI => (BPB-1 downto 0 => '0'),
CRC => (tCRC'range => (BPB-1 downto 0 => '0'))
);

signal g : t;
signal r : t := c;

begin

P_COMB : process (iINI, iE, iD, r)
variable v : t := c;
begin
if (iINI = '1') then
v.E := '0';
v.D := (BPB-1 downto 0 => '0');
v.RI := (BPB-1 downto 0 => '0');
F_CRC_INITIALIZE : for i in tCRC'range loop
v.CRC(i) := (BPB-1 downto 0 => '0');
end loop F_CRC_INITIALIZE;
elsif (iE = '1') then
v.E := '1';
v.D := iD;
v.RI := iD xor r.CRC(tCRC'high);
F_CRC_UPDATE : for i in tCRC'range loop
if (i = tCRC'low) then
v.CRC(i) :=
cCRC_REMAINDER(conv_integer(unsigned(v.RI)))((i+1)*BPB-1 downto i*BPB);
else
v.CRC(i) :=
r.CRC(i-1) xor
cCRC_REMAINDER(conv_integer(unsigned(v.RI)))((i+1)*BPB-1 downto i*BPB);
end if;
end loop F_CRC_UPDATE;
else
v.E := '0';
v.D := r.D;
v.RI := r.RI;
v.CRC := r.CRC;
end if;

g <= v;
oE <= r.E;
oD <= r.D;
F_CRC_OUTPUT : for i in tCRC'range loop
oCRC((i+1)*BPB-1 downto i*BPB) <= r.CRC(i);
end loop F_CRC_OUTPUT;
end process P_COMB;

G_ASYNC : if (ASYNC = true) generate
begin
P_SEQ : process (iCLR, iCLK)
begin
if (iCLR = '1') then
r <= c;
elsif (iCLK'event and iCLK = '1') then
r <= g;
end if;
end process P_SEQ;
end generate G_ASYNC;

G_SYNC : if (ASYNC = false) generate
begin
P_SEQ : process (iCLK)
begin
if (iCLK'event and iCLK = '1') then
if (iCLR = '1') then
r <= c;
else
r <= g;
end if;
end if;
end process P_SEQ;
end generate G_SYNC;

end architecture TP;

最後に,やる気の無いテストベンチをでっち上げ.
library ieee;
use ieee.std_logic_1164.all;
use work.CRC_GENERATOR_PKG.all;
use work.BYTE_CRC_PKG.all;

entity BENCH_BYTE_CRC is
begin
end entity BENCH_BYTE_CRC;

architecture BENCH of BENCH_BYTE_CRC is

constant cCLK_CYCLE : time := 1 us;
constant cCLR_TIME : time := 10*cCLK_CYCLE;

signal sCLK : std_logic := '0';
signal sCLR : std_logic := '1';

type tST is (INIT, BYTE1, BYTE0);

signal sST : tST := INIT;
signal sINI : std_logic := '0';
signal sE : std_logic := '0';
signal sD : std_logic_vector(7 downto 0) := (7 downto 0 => '0');

signal sBYTE_CRC_oE : std_logic;
signal sBYTE_CRC_oD : std_logic_vector( 7 downto 0);
signal sBYTE_CRC_oCRC : std_logic_vector(15 downto 0);

begin

P_sCLK : process
begin
sCLK <= '0'; wait for cCLK_CYCLE/2;
sCLK <= '1'; wait for cCLK_CYCLE/2;
end process P_sCLK;

P_sCLR : process
begin
sCLR <= '1'; wait for cCLR_TIME;
sCLR <= '0'; wait;
end process P_sCLR;

P_sST_sINI_sE_sD : process (sCLK)
begin
if (sCLK'event and sCLK = '1') then
if (sCLR = '1') then
sST <= INIT;
sINI <= '1';
sE <= '0';
sD <= (7 downto 0 => '0');
else
case sST is
when INIT =>
sST <= BYTE1;
sINI <= '0';
sE <= '1';
sD <= X"6D";
when BYTE1 =>
sST <= BYTE0;
sINI <= '0';
sE <= '1';
sD <= X"27";
when BYTE0 =>
sST <= BYTE0;
sINI <= '0';
sE <= '0';
sD <= sD;
when others =>
sST <= INIT;
sINI <= '1';
sE <= '0';
sD <= (7 downto 0 => '0');
end case;
end if;
end if;
end process P_sST_sINI_sE_sD;

U_BYTE_CRC : BYTE_CRC
generic map (
BPB => 8,
GENERATOR => cCRC_16_IBM_GENERATOR,
ASYNC => false
)
port map (
iCLK => sCLK,
iCLR => sCLR,
iINI => sINI,
iE => sE,
iD => sD,
oE => sBYTE_CRC_oE,
oD => sBYTE_CRC_oD,
oCRC => sBYTE_CRC_oCRC
);

end architecture BENCH;

pipeline化をサボっているのでクロックが早くなるとダメになる事ウケアイ.
ま,quick'n'dirtyっつー事で. :)

2009/03/31

MeasureSLOC(&AL9); /* 2009/03 */

AでLで9なdiffstat,3月分.
[diffstat for AL9, for 2009/03.]
 a/vhdl/BUFGMUX4_COMPAT.vhd    |  182 --------
a/vhdl/CBUF.vhd | 298 -------------
a/vhdl/DCM_TROLL.vhd | 320 --------------
a/vhdl/FBUFG.vhd | 91 ----
a/vhdl/FBUFGCE.vhd | 95 ----
a/vhdl/LDPCD-dummy.vhd | 116 -----
a/vhdl/LLR2SCB.vhd | 187 --------
b/bench/BENCH_BER_IF_REG.vhd | 134 ++++++
b/bench/BENCH_SCB2SCN2SCW.vhd | 208 +++++++++
b/bench/BENCH_TSR_CLK.vhd | 63 ++
b/bench/BENCH_WSX_LFSR.vhd | 155 +++++++
b/vhdl/BCBOOL.vhd | 451 ++++++++++++++++++++
b/vhdl/BER_IF_REG.vhd | 682 +++++++++++++++++++++++++++++++
b/vhdl/COMMON_TYPE_PKG.vhd | 54 ++
b/vhdl/CSSSTM.vhd | 262 ++++++++++++
b/vhdl/LDPCD-stub.vhd | 113 +++++
b/vhdl/LDPCE-stub.vhd | 183 ++++++++
b/vhdl/LLR2SC.vhd | 267 ++++++++++++
b/vhdl/SCN.vhd | 237 ++++++++++
b/vhdl/SCW.vhd | 242 +++++++++++
b/vhdl/TEIADD.vhd | 190 ++++++++
b/vhdl/TSR_CLK.vhd | 475 +++++++++++++++++++++
b/vhdl/WSX_LFSR.vhd | 408 ++++++++++++++++++
bench/BENCH_BER_IF_CLK.vhd | 8
bench/BENCH_FCO.vhd | 61 +-
vhdl/BCMUX.vhd | 149 ++++--
vhdl/BER_IF_CLK.vhd | 8
vhdl/BYTEREV.vhd | 37 +
vhdl/CLDPCDOP.vhd | 83 +--
vhdl/ELDPCDII.vhd | 43 -
vhdl/FCO.vhd | 157 ++-----
vhdl/FCOD.vhd | 329 +++++++--------
vhdl/HD2BO.vhd | 219 +++++-----
vhdl/LDPCD.vhd | 59 +-
vhdl/LDPCE.vhd | 79 ---
vhdl/LDPCEDB.vhd | 914 +++++++++++++++++-------------------------
vhdl/NIBBLESW.vhd | 37 +
vhdl/PN_NEGOTIATE.vhd | 14
vhdl/S2BER_IF.vhd | 278 ++++++++----
vhdl/SBSSBDD.vhd | 124 ++++-
vhdl/SCB.vhd | 217 ++-------
vhdl/SELDPCDIIM.vhd | 16
vhdl/VTQUEUE.vhd | 103 ++--
43 files changed, 5554 insertions(+), 2794 deletions(-)
10kSLOC逝ってないYO!!1 :DDD
[ZOMG, under 10kSLOC!!1 :DDD]

ファイル名で分かるがLDPC関係なので,勉強ついでにコレを買ってチョロチョロ読んでいる.Reed-Solomon, Turbo, LDPCが一通り載ってるし,分厚くてとても良さ気. :)
[Yup, it's LDPC related project, so I bought this book. It explains Reed-Solomon, Turbo and LDPC. AND THEN ITZ T3H THICK!!1 :)]

2009/03/15

Ypsilon.Makefile.karma--;

Ypsilon,R^6RSなscheme,GCがアレでメニィコアによろしいらしい.
Makefileより,
#   Makefile for Linux, FreeBSD, OpenBSD, and Darwin
# Requirements: GNU Make, GCC 4.0 or later
# Options: DESTDIR, PREFIX, DATAMODEL(ILP32/LP64), USE_SDL(ON)

PROG = ypsilon

PREFIX = /usr/local

CPPFLAGS = -DNDEBUG -DSYSTEM_SHARE_PATH='"$(DESTDIR)$(PREFIX)/share/$(PROG)"'

CXXFLAGS = -pipe -x c++ -O3 -fstrict-aliasing -fomit-frame-pointer -momit-leaf-frame-pointer

SRCS = file.cpp main.cpp vm0.cpp object_heap_compact.cpp subr_flonum.cpp vm1.cpp object_set.cpp \
subr_hash.cpp vm2.cpp object_slab.cpp subr_list.cpp interpreter.cpp serialize.cpp \
vm3.cpp port.cpp subr_others.cpp arith.cpp printer.cpp subr_port.cpp subr_r5rs_arith.cpp \
equiv.cpp reader.cpp ffi.cpp subr_base.cpp bag.cpp \
subr_unicode.cpp hash.cpp subr_base_arith.cpp ucs4.cpp ioerror.cpp subr_bitwise.cpp utf8.cpp \
main.cpp subr_bvector.cpp violation.cpp object_factory.cpp \
subr_ffi.cpp object_heap.cpp subr_fixnum.cpp bit.cpp list.cpp fasl.cpp socket.cpp subr_socket.cpp

VPATH = src

UNAME = $(shell uname -a)

ifndef DATAMODEL
ifeq ($(shell echo | $(CXX) -E -dM - | grep '__LP64__'), )
DATAMODEL = ILP32
else
DATAMODEL = LP64
endif
endif

ifneq (, $(findstring Linux, $(UNAME)))
ifeq ($(shell $(CXX) -dumpspecs | grep 'march=native'), )
ifeq ($(DATAMODEL), ILP32)
CXXFLAGS += -march=i686
endif
else
CXXFLAGS += -march=native
endif
ifeq ($(shell grep -i sse2 /proc/cpuinfo), )
CXXFLAGS += -msse
else
CXXFLAGS += -msse2
endif
CXXFLAGS += -mfpmath=sse -pthread
ifeq ($(DATAMODEL), ILP32)
CPPFLAGS += -DDEFAULT_HEAP_LIMIT=32
CXXFLAGS += -m32
LDFLAGS = -m32
ASFLAGS = --32
SRCS += ffi_stub_linux.s
else
CPPFLAGS += -DDEFAULT_HEAP_LIMIT=64
CXXFLAGS += -m64
LDFLAGS = -m64
ASFLAGS = --64
SRCS += ffi_stub_linux64.s
endif
LDLIBS = -lpthread -ldl
endif

ifneq (, $(findstring FreeBSD, $(UNAME)))
ifeq ($(shell $(CXX) -dumpspecs | grep 'march=native'), )
ifeq ($(DATAMODEL), ILP32)
CXXFLAGS += -march=i686
endif
else
CXXFLAGS += -march=native
endif
ifeq ($(shell dmesg | grep -i sse2), )
CXXFLAGS += -msse
else
CXXFLAGS += -msse2
endif
CXXFLAGS += -mfpmath=sse -pthread
CPPFLAGS += -D__LITTLE_ENDIAN__
ifeq ($(DATAMODEL), ILP32)
CPPFLAGS += -DDEFAULT_HEAP_LIMIT=32
CXXFLAGS += -m32
LDFLAGS = -m32
ASFLAGS = --32
SRCS += ffi_stub_freebsd.s
else
CPPFLAGS += -DDEFAULT_HEAP_LIMIT=64
CXXFLAGS += -m64
LDFLAGS = -m64
ASFLAGS = --64
SRCS += ffi_stub_freebsd64.s
endif
LDLIBS = -pthread
endif

ifneq (, $(findstring OpenBSD, $(UNAME)))
ifeq ($(shell $(CXX) -dumpspecs | grep 'march=native'), )
ifeq ($(DATAMODEL), ILP32)
CXXFLAGS += -march=i686
endif
else
CXXFLAGS += -march=native
endif
ifeq ($(shell dmesg | grep -i sse2), )
CXXFLAGS += -msse
else
CXXFLAGS += -msse2
endif
CXXFLAGS += -mfpmath=sse -pthread
CPPFLAGS += -D__LITTLE_ENDIAN__ -DNO_TLS
ifeq ($(DATAMODEL), ILP32)
CPPFLAGS += -DDEFAULT_HEAP_LIMIT=32
CXXFLAGS += -m32
LDFLAGS = -m32
ASFLAGS = --32
SRCS += ffi_stub_openbsd.s
else
CPPFLAGS += -DDEFAULT_HEAP_LIMIT=64
CXXFLAGS += -m64
LDFLAGS = -m64
ASFLAGS = --64
SRCS += ffi_stub_openbsd64.s
endif
LDLIBS = -pthread
endif

ifneq (, $(findstring Darwin, $(UNAME)))
CXXFLAGS += -arch i386 -msse2 -mfpmath=sse
CPPFLAGS += -DNO_TLS
SRCS += ffi_stub_darwin.s
ifneq (, $(USE_SDL))
CPPFLAGS += -DUSE_SDL
LDFLAGS = extension/SDL/darwin/i386/SDLmain.o -framework SDL -framework Cocoa
endif
endif

[SNIP]

clean:
rm -f *.o *.d
rm -f $(HOME)/.ypsilon/*.cache
rm -f $(HOME)/.ypsilon/*.time

[SNIP]

x86/amd64大好きらしい,cleanは$(HOME)までお掃除する親切設計. :DDD