Skip to content

Commit 37158f5

Browse files
🐛 Hotfix Duostra topological order
* 🐛 Hotfix Duostra topological order * 📊 add regression test * 🎨 lint --------- Co-authored-by: chinyi0523 <james31423a@gmail.com>
1 parent 8c49774 commit 37158f5

5 files changed

Lines changed: 132 additions & 0 deletions

File tree

src/duostra/circuit_topology.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,20 @@ void CircuitTopology::print_gates_with_prevs() {
140140
}
141141
}
142142

143+
/**
144+
* @brief HOTFIX map<old, new>
145+
*
146+
* @param map
147+
*/
148+
void Gate::set_prevs(std::unordered_map<size_t, size_t> const& map) {
149+
for (size_t i = 0; i < _prevs.size(); i++) {
150+
_prevs[i] = map.at(_prevs[i]);
151+
}
152+
}
153+
void Gate::set_nexts(std::unordered_map<size_t, size_t> const& map) {
154+
for (size_t i = 0; i < _nexts.size(); i++) {
155+
_nexts[i] = map.at(_nexts[i]);
156+
}
157+
}
158+
143159
} // namespace qsyn::duostra

src/duostra/circuit_topology.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,13 @@ class Gate {
3838
qcir::GateRotationCategory get_type() const { return _type; }
3939
dvlab::Phase get_phase() const { return _phase; }
4040

41+
void set_id(size_t id) { _id = id; }
4142
void set_type(qcir::GateRotationCategory t) { _type = t; }
4243
void set_phase(dvlab::Phase p) { _phase = p; }
4344
void add_prev(size_t prev_gate_id);
4445
void add_next(size_t next_gate_id);
46+
void set_prevs(std::unordered_map<size_t, size_t> const&);
47+
void set_nexts(std::unordered_map<size_t, size_t> const&);
4548

4649
bool is_available(std::unordered_map<size_t, size_t> const&) const;
4750
bool is_swapped() const { return _swap; }

src/duostra/duostra.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,15 @@ void Duostra::make_dependency() {
7979
}
8080
all_gates.emplace_back(std::move(temp_gate));
8181
}
82+
std::unordered_map<size_t, size_t> reordered_map;
83+
for (size_t i = 0; i < all_gates.size(); i++) {
84+
reordered_map[all_gates[i].get_id()] = i;
85+
}
86+
for (size_t i = 0; i < all_gates.size(); i++) {
87+
all_gates[i].set_id(reordered_map[all_gates[i].get_id()]);
88+
all_gates[i].set_prevs(reordered_map);
89+
all_gates[i].set_nexts(reordered_map);
90+
}
8291
_dependency = make_shared<DependencyGraph>(_logical_circuit->get_num_qubits(), std::move(all_gates));
8392
}
8493

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
device read benchmark/topology/casablanca.layout
2+
qcir qubit add 3
3+
qcir gate add h 0
4+
qcir gate add h 1 --prepend
5+
qcir gate add cz 0 2 --prepend
6+
qcir gate add cz 1 2 --prepend
7+
qcir gate add h 0 --prepend
8+
qcir gate add h 1 --prepend
9+
qcir gate add h 2 --prepend
10+
qcir gate add h 2 --prepend
11+
qcir print -d
12+
duostra -c
13+
qcir new
14+
qcir qubit add 3
15+
qcir gate add cx 2 1
16+
qcir gate add cx 2 0
17+
qc2zx
18+
zxopt
19+
zx2qc
20+
qcir print -d
21+
duostra -c
22+
23+
quit -f
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
qsyn> device read benchmark/topology/casablanca.layout
2+
3+
qsyn> qcir qubit add 3
4+
5+
qsyn> qcir gate add h 0
6+
7+
qsyn> qcir gate add h 1 --prepend
8+
9+
qsyn> qcir gate add cz 0 2 --prepend
10+
11+
qsyn> qcir gate add cz 1 2 --prepend
12+
13+
qsyn> qcir gate add h 0 --prepend
14+
15+
qsyn> qcir gate add h 1 --prepend
16+
17+
qsyn> qcir gate add h 2 --prepend
18+
19+
qsyn> qcir gate add h 2 --prepend
20+
21+
qsyn> qcir print -d
22+
Q 0 - h( 4)----------------------------------cz( 2)-- h( 0)-
23+
Q 1 - h( 5)------------------cz( 3)-- h( 1)-
24+
Q 2 - h( 7)-- h( 6)----------cz( 3)----------cz( 2)-
25+
26+
qsyn> duostra -c
27+
Routing...
28+
29+
Checking...
30+
31+
Duostra Result:
32+
33+
Scheduler: search
34+
Router: duostra
35+
Placer: dfs
36+
37+
Mapping Depth: 13
38+
Total Time: 16
39+
#SWAP: 1
40+
41+
42+
qsyn> qcir new
43+
44+
qsyn> qcir qubit add 3
45+
46+
qsyn> qcir gate add cx 2 1
47+
48+
qsyn> qcir gate add cx 2 0
49+
50+
qsyn> qc2zx
51+
52+
qsyn> zxopt
53+
[error] Unknown command!! (zxopt)
54+
55+
qsyn> zx2qc
56+
[error] ZXGraph 0 is not extractable because it is not graph-like!!
57+
58+
qsyn> qcir print -d
59+
Q 0 -------------------------cx( 1)-
60+
Q 1 ---------cx( 0)-
61+
Q 2 ---------cx( 0)----------cx( 1)-
62+
63+
qsyn> duostra -c
64+
Routing...
65+
66+
Checking...
67+
68+
Duostra Result:
69+
70+
Scheduler: search
71+
Router: duostra
72+
Placer: dfs
73+
74+
Mapping Depth: 10
75+
Total Time: 10
76+
#SWAP: 1
77+
78+
79+
qsyn>
80+
qsyn> quit -f
81+

0 commit comments

Comments
 (0)