作者ric2k1 (Ric)
看板EE_DSnP
標題Re: [更正] Final project...
時間Sun Jun 14 01:44:52 2009
更正了一些這幾天同學們提出的問題...
有四項更正, 請仔細閱讀, 並作適當的 update!
(你將 bdd/ 這個 directory rename (i.e. mv) 成 b9x901xxx_bdd/ 了沒?)
============================================================================
[06/14/2009] (1:30am) Hash::forceInsert() 的 prototype
由 "void forceInsert(const HashKey& k, HashData d) { }"
改成 "void forceInsert(const HashKey& k, const HashData& d) { }"
> Affected file: myHash.h
> Updated: bdd.tgz
[06/14/2009] (1:30am) CIRGate 不能 report ID = 0 的 gate
已修正.
> Affected file: libcirref-*.a
> Updated: bdd.tgz
[06/14/2009] (1:30am) BDRAW 的 error message
修正 2129 篇所提到的問題:
bdraw 14 14.dot //假設gateID只有到13
ref的結果是:
Error: "14" is not a legal BDD node!!
Illegal option!! (14.dot)
但是第二行應該是Illegal option!! (14)比較合理
> Affected file: bddCmd.cpp
> Updated: bdd.tgz
[06/14/2009] (1:30am) 沒寫 BddMgr::standardize(), BDD 也應該要對
只是會比較慢而已.
但是原來的 ref code 如果你沒有寫 BddMgr::standardize() 有些 case 可能會錯.
這個原因說來有點複雜...
如果有照講義的方式去 standardize ITE 的 parameters 的話,
那麼 BddMgr::ite() 裡面的:
BddNode t = ite(fl, gl, hl);
應該永遠不會產生 negative phase (因為 fl and gl 都沒有 bubbles).
也就是說, 原先 code 裡的這行:
if (t.isNegEdge()) { ...
應該永遠不會成立 (i.e. if() { ... } 裡面的 code 是 redundant code),
所以 "_computedTable.write(k, ret_t);" 寫在:
if (isNegEdge)
ret = ~ret;
之前是 OK 的.
因此, 如果你的 standardize() 沒有寫, 或是沒寫對的話,
你的 "if (t.isNegEdge())" 就有可能會成立, 而建出錯誤的 BDD...
請 download 新版的 bdd.tgz 來參考新版的 bddMgr.cpp,
"BddMgr::ite()" 的 code 裏頭加上了一個 compiler directive:
"#define DO_STD_ITE 0"
如果你還沒做好 standardize(), 它會幫你 take care 好
"if (t.isNegEdge())" 成立時所會造成的問題.
等你 standardsize() 寫好之後, 你可以將它改成:
"#define DO_STD_ITE 1"
這樣子它會去 assert "if (t.isNegEdge())" 不應該成立因而少 run 一些
redundant code.
當然, 不改 (i.e. #define DO_STD_ITE 0) 應該也是不會錯的.
> Affected file: bddMgr.cpp
> Updated: bdd.tgz
[06/10/2009] (11:30pm) 請在 "bddMgr.cpp" 的 "BddMgr::init()" 加上一行
void
BddMgr::init(size_t nin, size_t h, size_t c)
{
_uniqueTable.init(h);
_computedTable.init(c);
// This must be called first
BddNode::setBddMgr(this);
BddNodeInt::_terminal = uniquify(0, 0, 0);
BddNode::_one = BddNode(BddNodeInt::_terminal, BDD_POS_EDGE);
BddNode::_zero = BddNode(BddNodeInt::_terminal, BDD_NEG_EDGE);
_supports.resize(0); // Fixed: 06/10/2009
_supports.reserve(nin+1);
_supports.push_back(BddNode::_one);
for (size_t i = 1; i <= nin; ++i)
_supports.push_back(BddNode(BddNode::_one(), BddNode::_zero(), i));
}
黃色那行.
不加的話, 照攻略寫到第 (vi) 步你的 testBdd 應該會當掉!
除非你的 BddMgr::reset() (攻略第 (viii)) 已經寫完.
(不過其他 BDD command 可能是 OK 的).
> Affected file: bddMgr.cpp
> Updated: bdd.tgz
[06/06/2009] (4:50pm) CIRSETVar 忘記reset CirMgr::_bddVarOrder
> 更正: CirMgr constructor ==> 必須initialize _bddVarOrder to PI_NONE
> In "CirSetVarCmd::exec()", need to call "cirMgr->resetBddVarOrder()"
when "Error: support size is smaller than the circuit input size!!"
> Affected files: lib/libcirref-*.a, ref/bdd-*, src/cir/cirMgr.h
> Updated: bdd.tgz, ref/bdd-32, ref/bdd-64, BDD project.htm
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.224.42.52
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.224.46.125
※ 編輯: ric2k1 來自: 61.224.46.125 (06/11 00:02)
1F:推 chwt2788:bdd> cirg 0 -fani 0 好像不能印編號0的gate? 06/11 13:27
2F:→ chwt2788:試其他編號都可以 06/11 13:27
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.224.40.24
3F:→ ric2k1:Hello Colby~~~ the 4th item is what you were talking 06/14 01:45
4F:→ ric2k1:about 3 months ago, right? 06/14 01:46
5F:→ ric2k1:BDD project.htm 也已更新 06/14 01:57