@@ -3,20 +3,17 @@ PERL=/usr/bin/perl
3
3
PYTHON =/usr/bin/python
4
4
5
5
ROOT =".."
6
- DIRNAME =""
7
6
FILENAME =""
8
7
FILE =""
9
8
CFILE =""
10
- TOFF =0
11
- CTQG =0
12
- ROTATIONS =0
9
+ DIRNAME =""
13
10
14
11
BUILD =$(ROOT ) /build/Release+Asserts
15
12
16
13
SQCTPATH =$(ROOT ) /Rotations/sqct/rotZ
17
14
GRIDSYNTHPATH =$(ROOT ) /Rotations/gridsynth/gridsynth
18
15
ROTATIONPATH =$(GRIDSYNTHPATH ) # select rotation decomposition tool
19
- PRECISION=""
16
+ SCRIPTSPATH= $( ROOT ) /scripts/ # select rotation decomposition tool
20
17
21
18
CC =$(BUILD ) /bin/clang
22
19
OPT =$(BUILD ) /bin/opt
@@ -32,11 +29,14 @@ SCAFFOLD_LIB=$(ROOT)/build/Release+Asserts/lib/Scaffold.dylib
32
29
endif
33
30
34
31
32
+ RKQC =0
33
+ ROTATIONS =0
34
+ TOFF =0
35
+
35
36
# ###############################
36
37
# Resource Count Estimation
37
38
# ###############################
38
39
resources : $(FILE ) .resources
39
- @cat $(FILE ) .resources
40
40
41
41
# ###############################
42
42
# Flat QASM generation
@@ -48,30 +48,24 @@ flat: $(FILE).qasmf
48
48
# ###############################
49
49
qasm : $(FILE ) .qasmh
50
50
51
- .PHONY : res_count qasm flat
51
+ # ###############################
52
+ # QX Simulator generation
53
+ # ###############################
54
+ qc : $(FILE ) .qc
55
+
56
+ .PHONY : resources qasm flat qc
52
57
53
58
# ###############################
54
59
# Intermediate targets
55
60
# ###############################
56
- # Pre-process CTQG
61
+ # Compile Scaffold to LLVM bytecode
62
+
57
63
$(FILE ) _merged.scaffold : $(FILENAME )
58
- @if [ $( CTQG) -eq 1 ]; then \
59
- echo " [Scaffold.makefile] Extracting CTQG from Scaffold ..." ; \
60
- $(PERL ) $(ROOT ) /ctqg/trans/pre_process.pl $(FILENAME ) ; \
61
- echo " [Scaffold.makefile] Compiling CTQG ..." ; \
62
- $(ROOT ) /ctqg/CTQG/ctqg $(CFILE ) .ctqg; \
63
- echo " [Scaffold.makefile] Merging CTQG output back into Scaffold ..." ; \
64
- $(PERL) $(ROOT)/ctqg/trans/trans.pl $(CFILE).qasm > trans.qasm; \
65
- mv trans.qasm $(CFILE).qasm; \
66
- $(PERL) $(ROOT)/ctqg/trans/merge.pl $(CFILE).qasm; \
67
- else \
68
- cp $(FILENAME) $(FILE)_merged.scaffold; \
69
- fi
64
+ @cp $(FILENAME ) $(FILE ) _merged.scaffold
70
65
71
- # Compile Scaffold to LLVM bytecode
72
66
$(FILE ) .ll : $(FILE ) _merged.scaffold
73
- @echo " [Scaffold.makefile] Compiling $( FILE) _merged .scaffold ..."
74
- @$(CC ) $(FILE ) _merged.scaffold $(CC_FLAGS ) -o $(FILE ) .ll
67
+ @echo " [Scaffold.makefile] Compiling $( FILE) .scaffold ..."
68
+ @$(CC ) $(FILE ) _merged.scaffold $(CC_FLAGS ) -o $(FILE ) .ll
75
69
76
70
$(FILE ) 1.ll : $(FILE ) .ll
77
71
@echo " [Scaffold.makefile] Transforming cbits ..."
@@ -117,40 +111,53 @@ $(FILE)7.ll: $(FILE)6.ll
117
111
cp $(FILE ) 6.ll $(FILE ) 7.ll; \
118
112
elif [ $( ROTATIONS) -eq 1 ]; then \
119
113
echo " [Scaffold.makefile] Decomposing Rotations ..." ; \
120
- if [ ! -e /tmp/epsilon-net.0.bin ]; then echo " Generating decomposition databases" ; fi ; \
114
+ if [ ! -e /tmp/epsilon-net.0.bin ]; then echo " Generating decomposition databases; this may take up to an hour " ; fi ; \
121
115
export ROTATIONPATH=$(ROTATIONPATH ) ; \
122
- export PRECISION =$(PRECISION ) ; \
123
116
$(OPT ) -S -load $(SCAFFOLD_LIB ) -Rotations $(FILE ) 6.ll -o $(FILE ) 7.ll > /dev/null; \
124
117
else \
125
118
cp $(FILE ) 6.ll $(FILE ) 7.ll; \
126
119
fi
127
120
128
121
# Remove any code that is useless after optimizations
129
- $(FILE ) 10 .ll : $(FILE ) 7.ll
122
+ $(FILE ) 8 .ll : $(FILE ) 7.ll
130
123
@echo " [Scaffold.makefile] Internalizing and Removing Unused Functions ..."
131
- @$(OPT ) -S $(FILE ) 7.ll -internalize -globaldce -deadargelim -o $(FILE ) 10.ll > /dev/null
124
+ @$(OPT ) -S $(FILE ) 7.ll -internalize -globaldce -deadargelim -o $(FILE ) 8.ll > /dev/null
125
+
126
+ # Compile RKQC
127
+ $(FILE ) 9.ll : $(FILE ) 8.ll
128
+ @if [ $( RKQC) -eq 1 ]; then \
129
+ echo "[Scaffold.makefile] Compiling RKQC Functions ..."; \
130
+ $(OPT) -S -load $(SCAFFOLD_LIB) -GenRKQC $(FILE)8.ll -o $(FILE)9.ll > /dev/null 2> $(FILE).errs; \
131
+ else \
132
+ mv $(FILE)8.ll $(FILE)9.ll; \
133
+ fi
132
134
133
135
# Perform Toffoli decomposition if TOFF is 1
134
- $(FILE ) 11.ll : $(FILE ) 10 .ll
136
+ $(FILE ) 11.ll : $(FILE ) 9 .ll
135
137
@if [ $( TOFF) -eq 1 ]; then \
136
138
echo "[Scaffold.makefile] Toffoli Decomposition ..."; \
137
- $(OPT) -S -load $(SCAFFOLD_LIB) -ToffoliReplace $(FILE)10 .ll -o $(FILE)11.ll > /dev/null; \
139
+ $(OPT) -S -load $(SCAFFOLD_LIB) -ToffoliReplace $(FILE)9 .ll -o $(FILE)11.ll > /dev/null; \
138
140
else \
139
- cp $(FILE)10 .ll $(FILE)11.ll; \
141
+ cp $(FILE)9 .ll $(FILE)11.ll; \
140
142
fi
141
143
144
+ # Insert reverse functions if REVERSE is 1
145
+ $(FILE ) 12.ll : $(FILE ) 11.ll
146
+ @echo " [Scaffold.makefile] Inserting Reverse Functions..."
147
+ @$(OPT ) -S -load $(SCAFFOLD_LIB ) -FunctionReverse $(FILE ) 11.ll -o $(FILE ) 12.ll > /dev/null
148
+
142
149
# Generate resource counts from final LLVM output
143
- $(FILE ) .resources : $(FILE ) 11 .ll
150
+ $(FILE ) .resources : $(FILE ) 12 .ll
144
151
@echo " [Scaffold.makefile] Generating resource count ..."
145
- @$(OPT ) -load $(SCAFFOLD_LIB ) -ResourceCount $(FILE ) 11 .ll 2> $(FILE ) .resources > /dev/null
152
+ @$(OPT ) -load $(SCAFFOLD_LIB ) -ResourceCount $(FILE ) 12 .ll 2> $(FILE ) .resources > /dev/null
146
153
@echo " [Scaffold.makefile] Resources written to $( FILE) .resources ..."
147
154
148
- # Generate hierarchical QASM
149
- $(FILE ) .qasmh : $(FILE ) 11.ll
155
+ $(FILE ) .qasmh : $(FILE ) 12.ll
150
156
@echo " [Scaffold.makefile] Generating hierarchical QASM ..."
151
- @$(OPT ) -load $(SCAFFOLD_LIB ) -gen-qasm $(FILE ) 11 .ll 2> $(FILE ) .qasmh > /dev/null
157
+ @$(OPT ) -load $(SCAFFOLD_LIB ) -gen-qasm $(FILE ) 12 .ll 2> $(FILE ) .qasmh > /dev/null
152
158
@echo " [Scaffold.makefile] Hierarchical QASM written to $( FILE) .qasmh ..."
153
159
160
+
154
161
# Translate hierarchical QASM back to C++ for flattening
155
162
$(FILE ) _qasm.scaffold : $(FILE ) .qasmh
156
163
@echo " [Scaffold.makefile] Generating flattened QASM ..."
@@ -164,15 +171,19 @@ $(FILE)_qasm: $(FILE)_qasm.scaffold
164
171
$(FILE ) .qasmf : $(FILE ) _qasm
165
172
@./$(FILE ) _qasm > $(FILE ) .tmp
166
173
@cat fdecl.out $(FILE ) .tmp > $(FILE ) .qasmf
167
- @echo " [Scaffold.makefile] Flat QASM written to $( FILE) .qasmf ..."
174
+ @echo " [Scaffold.makefile] Flat QASM written to $( FILE) .qasmf ..."
175
+
176
+ $(FILE ) .qc : $(FILE ) .qasmf
177
+ @echo " [Scaffold.makefile] Transforming flat QASM to QX Simulator input ..."
178
+ @$(SHELL ) $(ROOT ) /scripts/qasmf2qc.sh $(FILE ) .qasmf
179
+ @echo " [Scaffold.makefile] QX Simulator input written to $( FILE) .qc ..."
168
180
169
181
# purge cleans temp files
170
182
purge :
171
- @rm -f $(FILE ) _merged.scaffold $(FILE ) _noctqg .scaffold $(FILE ) .ll $(FILE ) 1.ll $(FILE ) 1a.ll $(FILE ) 1b.ll $(FILE ) 2.ll $(FILE ) 3.ll $(FILE ) 4.ll $(FILE ) 5.ll $(FILE ) 5a.ll $(FILE ) 6.ll $(FILE ) 6tmp.ll $(FILE ) 7.ll $(FILE ) 8.ll $(FILE ) 9.ll $(FILE ) 10.ll $(FILE ) 11.ll $(FILE ) tmp.ll $(FILE ) _qasm $(FILE ) _qasm.scaffold fdecl.out $(CFILE ) .ctqg $(CFILE ) .c $(CFILE ) .signals $(FILE ) .tmp sim_$(CFILE ) $(FILE ) .* .qasm
183
+ @rm -f $(FILE ) _merged.scaffold $(FILE ) _no .scaffold $(FILE ) .ll $(FILE ) 1.ll $(FILE ) 1a.ll $(FILE ) 1b.ll $(FILE ) 2.ll $(FILE ) 3.ll $(FILE ) 4.ll $(FILE ) 5.ll $(FILE ) 5a.ll $(FILE ) 6.ll $(FILE ) 6tmp.ll $(FILE ) 7.ll $(FILE ) 8.ll $(FILE ) 9.ll $(FILE ) 10.ll $(FILE ) 11.ll $(FILE ) 12.ll $( FILE ) tmp.ll $(FILE ) _qasm $(FILE ) _qasm.scaffold fdecl.out $(CFILE ) .ctqg $(CFILE ) .c $(CFILE ) .signals $(FILE ) .tmp sim_$(CFILE ) $(FILE ) .* .qasm
172
184
173
185
# clean removes all completed files
174
186
clean : purge
175
- @rm -f $(FILE ) .resources $(FILE ) .qasmh $(FILE ) .qasmf
187
+ @rm -f $(FILE ) .resources $(FILE ) .qasmh $(FILE ) .qasmf $( FILE ) .qc
176
188
177
189
.PHONY : clean purge
178
-
0 commit comments