作者ric2k1 (Ric)
看板EE_DSnP
標題Re: [討論] HW#6 攻略
時間Wed Dec 9 17:23:24 2009
※ 引述《ric2k1 (Ric)》之銘言:
算是...... 雷文吧?
想到就把它寫下來的攻略, 給不知道如何下手的人參考.
只是建議, 不一定要這麼作.
想要 D.I.Y. 的人請按左鍵離開~~~
1. 定義 cir classes 的殼子.
建議可以定義:
In cirMgr.h --- class CirMgr
In cirGate.h --- class CirGate, CirInvGate, CirAndGate, ... etc.
2. 定義 cir classes 裡面的 data members.
CirMgr: vector<CirGate*> _piList, _poList, totalList;
CirGate: string _name; vector<CirGate*> _faninList;
先暫時這樣, 等到 circuit parse 的過程再來加.
3. 開始試著 parse circuit description file.
第一個 phase 應該是建立所有的 gate.
(i) 定義一個 public member function ---
bool CirMgr::readCircuit(const string& fileName);
寫在 cirMgr.cpp 中, 先讓它是空的, 直接 return true;
(ii) 在 cirMgr.cpp 裡面寫個 int main(), 裡面就 new 一個 cirMgr,
然後 cin 一個 fileName, 傳給 CirMgr::readCircuit()
(iii) 開始寫 CirMgr::readCircuit().
首先, 你要想好, readCircuit 分成幾個步驟?
每一步驟都可以是 CirMgr 的一個 private member function.
(1) 開檔: 所以要檢查開檔失敗的情況.
檔案已開, 所以你有一個 ifstream 的物件, 以下的步驟將以它為參數傳入.
(2) 讀 circuit name: 就讀吧, 記得將 circuit 名稱記下來 (a new data
member for CirMgr is added).
(3) 讀 input list: 這裡在讀的時候就可以 new CirPiGate 並將它存入
_piList. 不過要檢查是否有重複. 讀 input list 停止的條件為...?
(4) 讀 output list: 同 (3).
(5) 讀 gate list: 由一個 gate type keyword 開始, 讀到下一個 gate type
keyword, 或是 .end. 這裡應該 new specific derived gate classes.
並且可以算一下 #fanins, 一方面檢查有沒有錯, 一方面可以 initialize
_faninList 的 size (有什麼好處?).
(6) 讀到 .end
完成上述的工作後, 你可以在各個 derived class 的 constructor 裡 cout 一些
東西, 然後 compile cirMgr.cpp. 拿一個簡單的電路執行看看, 是否所有的 gate
都被抓到了?
(要的話也可以在這裡檢查一下 #fanins 是否合法?)
4. 將 ifstream obj rewind 到第一個 gate 的 definition (如何 rewind?).
我們準備 second phase, 建立接線.
這時候你會發現, 讀到 gate 的名字, 但是確不知道剛剛建立的 CirGate* 為何?
所以你在 3 的時候應該要用 map<string, Gate*> 將這個關係記錄下來. 而這個
map 應該是 local var 就好了.
5. 將 gate definitions 在讀過一遍, 建立連線.
建議用 cout 大法檢查一下連線是否有錯誤.
...
寫太多了. 接下來 DFS traversal, 建立 cirCmd.{h,cpp}, 以及 print(),
就請自求多福了!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.224.47.190
1F:推 hfsken:第一次看到有老師寫作業攻略的.... 05/27 13:04
2F:推 Peter034:想請問老師3.(ii)的部分,一個程式不是只能有一個main嗎? 06/01 00:14
3F:推 chengfred:測試用main 06/01 00:18
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.21.241