Fraunhofer-AISEC / cpg

A library to extract Code Property Graphs from C/C++, Java, Go, Python, Ruby and every other language through LLVM-IR.
https://fraunhofer-aisec.github.io/cpg/
Apache License 2.0
246 stars 59 forks source link

Operation implementation for quantum-cpg gates #1553

Open carlosgpal opened 1 week ago

carlosgpal commented 1 week ago

Hi there

I am encountering a lot of "An operation is not implemented" errors and would like to know if you could spend some time implementing simple gates in the qasm parser.

They are very simple gates to implement I think and would help a lot.

The simplest ones are the gates y, z, t, s, tdg, sdg. I think these could be implemented in the same way as the x-gate which is already implemented.

The other gates I would like to see implemented are the custom gates rx, ry, rz. These are a little more difficult to implement but could be implemented in a similar way to the cx gate. Only instead of having 2 qubits as parameters these have 1 qubit and a different parameter.

I include some files to test these new gates if you want to try them.

OPENQASM 2.0;
include "qelib1.inc";

qreg q[4];
creg c[4];

y q[1];
z q[2];
t q[0];
tdg q[1];
s q[2];
sdg q[3];

measure q[0]->c[0];
measure q[2]->c[1];
measure q[3]->c[2];
measure q[1]->c[3];
OPENQASM 2.0;
include "qelib1.inc";

qreg q[4];
creg c[4];

rx(pi/2) q[0];
ry(pi/4) q[1];
rz(pi/6) q[2];

measure q[0]->c[0];
measure q[2]->c[1];
measure q[3]->c[2];
measure q[1]->c[3];

Regards Carlos

KuechA commented 1 week ago

Hi, the first set of gates should be supported now. The rotation ones are still missing.

carlosgpal commented 1 week ago

Did you change any configuration recently because I am having problems executing trivial .qasm files that worked before

cpg-neo4j/build/install/cpg-neo4j/bin/cpg-neo4j --host=neo4j --user=neo4j --password=default1 /app/uploads/simple.qasm15:59:43,060 INFO TranslationConfiguration$Builder Registered language frontend 'CLanguage' for following file types: [c, h] 15:59:43,068 INFO TranslationConfiguration$Builder Registered language frontend 'CPPLanguage' for following file types: [cpp, cc, cxx, hpp, hh] 15:59:43,072 INFO TranslationConfiguration$Builder Registered language frontend 'JavaLanguage' for following file types: [java] 15:59:43,075 INFO TranslationConfiguration$Builder Registered language frontend 'PythonLanguage' for following file types: [py] 15:59:43,079 INFO TranslationConfiguration$Builder Registered language frontend 'OpenQasmLanguage' for following file types: [qasm] 15:59:43,153 INFO TranslationConfiguration$Builder Registered an extra (frontend dependent) default dependency: class de.fraunhofer.aisec.cpg.passes.DynamicInvokeResolver 15:59:43,153 INFO TranslationConfiguration$Builder Registered an extra (frontend dependent) default dependency: class de.fraunhofer.aisec.cpg.passes.CXXExtraPass 15:59:43,153 INFO TranslationConfiguration$Builder Registered an extra (frontend dependent) default dependency: class de.fraunhofer.aisec.cpg.passes.DynamicInvokeResolver 15:59:43,154 INFO TranslationConfiguration$Builder Registered an extra (frontend dependent) default dependency: class de.fraunhofer.aisec.cpg.passes.CXXExtraPass 15:59:43,155 INFO TranslationConfiguration$Builder Registered an extra (frontend dependent) default dependency: class de.fraunhofer.aisec.cpg.passes.JavaExternalTypeHierarchyResolver 15:59:43,157 INFO TranslationConfiguration$Builder Registered an extra (frontend dependent) default dependency: class de.fraunhofer.aisec.cpg.passes.PythonAddDeclarationsPass 15:59:43,161 INFO TranslationConfiguration$Builder Registered an extra (frontend dependent) default dependency: class de.fraunhofer.aisec.cpg.frontends.openqasm.passes.OpenQASMPass 15:59:43,161 INFO TranslationConfiguration$Builder Registered an extra (frontend dependent) default dependency: class de.fraunhofer.aisec.cpg.passes.quantumcpg.QuantumEOGPass 15:59:43,161 INFO TranslationConfiguration$Builder Registered an extra (frontend dependent) default dependency: class de.fraunhofer.aisec.cpg.passes.quantumcpg.QuantumDFGPass 15:59:43,163 INFO TranslationConfiguration$Builder Passes before enforcing order: [EdgeCachePass, QiskitPass, QuantumEOGPass, QuantumDFGPass, DFGConnectionPass, TypeHierarchyResolver, ImportResolver, SymbolResolver, DFGPass, DynamicInvokeResolver, EvaluationOrderGraphPass, TypeResolver, ControlFlowSensitiveDFGPass, FilenameMapper, PrepareSerialization, DynamicInvokeResolver, CXXExtraPass, DynamicInvokeResolver, CXXExtraPass, JavaExternalTypeHierarchyResolver, PythonAddDeclarationsPass, OpenQASMPass, QuantumEOGPass, QuantumDFGPass] 15:59:43,208 INFO TranslationConfiguration$Builder The following mermaid graph represents the pass dependencies:

flowchart TD;
    QiskitPass-->QuantumEOGPass;
    OpenQASMPass-->QuantumEOGPass;
    QiskitPass-->QuantumDFGPass;
    OpenQASMPass-->QuantumDFGPass;
    PrepareSerialization-->FilenameMapper;
    CXXExtraPass-->EvaluationOrderGraphPass;
    JavaExternalTypeHierarchyResolver-->ImportResolver;
    PythonAddDeclarationsPass-->SymbolResolver;
    SymbolResolver-->QiskitPass;
    EvaluationOrderGraphPass-->QiskitPass;
    EdgeCachePass-->QiskitPass;
    EvaluationOrderGraphPass-->QuantumEOGPass;
    QuantumEOGPass-->QuantumDFGPass;
    QuantumDFGPass-->DFGConnectionPass;
    ControlFlowSensitiveDFGPass-->DFGConnectionPass;
    TypeResolver-->TypeHierarchyResolver;
    TypeHierarchyResolver-->ImportResolver;
    TypeResolver-->SymbolResolver;
    TypeHierarchyResolver-->SymbolResolver;
    EvaluationOrderGraphPass-->SymbolResolver;
    SymbolResolver-->DFGPass;
    SymbolResolver-->DynamicInvokeResolver;
    DFGPass-->DynamicInvokeResolver;
    EvaluationOrderGraphPass-->ControlFlowSensitiveDFGPass;
    DFGPass-->ControlFlowSensitiveDFGPass;
    TypeResolver-->CXXExtraPass;
    TypeHierarchyResolver-->JavaExternalTypeHierarchyResolver;
    TypeResolver-->PythonAddDeclarationsPass;
    SymbolResolver-->OpenQASMPass;

15:59:43,211 INFO TranslationConfiguration$Builder Passes after enforcing order: [[EdgeCachePass, TypeResolver, PrepareSerialization], [TypeHierarchyResolver, CXXExtraPass, PythonAddDeclarationsPass], [EvaluationOrderGraphPass, JavaExternalTypeHierarchyResolver], [ImportResolver, SymbolResolver], [QiskitPass, DFGPass, OpenQASMPass], [QuantumEOGPass, DynamicInvokeResolver, ControlFlowSensitiveDFGPass], [QuantumDFGPass], [DFGConnectionPass], [FilenameMapper]] 15:59:43,213 INFO TranslationConfiguration$Builder Passes before enforcing order: [] 15:59:43,213 INFO TranslationConfiguration$Builder The following mermaid graph represents the pass dependencies:

flowchart TD;

15:59:43,214 INFO TranslationConfiguration$Builder Passes after enforcing order: [] 15:59:43,223 INFO MeasurementHolder TranslationManager: Translation into full graph 15:59:43,224 INFO MeasurementHolder TranslationManager: Executing Language Frontend 15:59:43,233 INFO TranslationManager Parsing /app/uploads/simple.qasm 15:59:43,297 INFO MeasurementHolder TranslationManager: Executing Language Frontend done in 69 ms 15:59:43,298 INFO MeasurementHolder EdgeCachePass: Executing Pass 15:59:43,314 INFO MeasurementHolder EdgeCachePass: Executing Pass done in 15 ms 15:59:43,314 INFO MeasurementHolder TypeResolver: Executing Pass 15:59:43,316 INFO MeasurementHolder TypeResolver: Executing Pass done in 1 ms 15:59:43,316 INFO MeasurementHolder PrepareSerialization: Executing Pass 15:59:43,394 INFO MeasurementHolder PrepareSerialization: Executing Pass done in 76 ms 15:59:43,394 INFO MeasurementHolder TypeHierarchyResolver: Executing Pass 15:59:43,398 INFO MeasurementHolder TypeHierarchyResolver: Executing Pass done in 3 ms 15:59:43,399 INFO MeasurementHolder CXXExtraPass: Executing Pass 15:59:43,406 INFO MeasurementHolder CXXExtraPass: Executing Pass done in 6 ms 15:59:43,406 INFO MeasurementHolder PythonAddDeclarationsPass: Executing Pass 15:59:43,407 INFO MeasurementHolder PythonAddDeclarationsPass: Executing Pass done in 0 ms 15:59:43,407 INFO MeasurementHolder EvaluationOrderGraphPass: Executing Pass 15:59:43,429 INFO MeasurementHolder EvaluationOrderGraphPass: Executing Pass done in 21 ms 15:59:43,429 INFO MeasurementHolder JavaExternalTypeHierarchyResolver: Executing Pass 15:59:43,431 INFO MeasurementHolder JavaExternalTypeHierarchyResolver: Executing Pass done in 1 ms 15:59:43,431 INFO MeasurementHolder ImportResolver: Executing Pass 15:59:43,434 INFO MeasurementHolder ImportResolver: Executing Pass done in 2 ms 15:59:43,435 INFO MeasurementHolder SymbolResolver: Executing Pass 15:59:43,450 INFO MeasurementHolder SymbolResolver: Executing Pass done in 14 ms 15:59:43,450 INFO MeasurementHolder QiskitPass: Executing Pass 15:59:43,452 INFO MeasurementHolder QiskitPass: Executing Pass done in 1 ms 15:59:43,453 INFO MeasurementHolder DFGPass: Executing Pass 15:59:43,458 INFO MeasurementHolder DFGPass: Executing Pass done in 5 ms 15:59:43,459 INFO MeasurementHolder OpenQASMPass: Executing Pass 15:59:43,462 INFO MeasurementHolder OpenQASMPass: Executing Pass done in 3 ms 15:59:43,463 INFO MeasurementHolder QuantumEOGPass: Executing Pass 15:59:43,465 INFO MeasurementHolder QuantumEOGPass: Executing Pass done in 2 ms 15:59:43,465 INFO MeasurementHolder DynamicInvokeResolver: Executing Pass 15:59:43,469 INFO MeasurementHolder DynamicInvokeResolver: Executing Pass done in 2 ms 15:59:43,469 INFO MeasurementHolder ControlFlowSensitiveDFGPass: Executing Pass 15:59:43,472 INFO MeasurementHolder ControlFlowSensitiveDFGPass: Executing Pass done in 3 ms 15:59:43,472 INFO MeasurementHolder QuantumDFGPass: Executing Pass 15:59:43,474 INFO MeasurementHolder TranslationManager: Translation into full graph done in 249 ms java.util.concurrent.ExecutionException: java.util.NoSuchElementException: Collection contains no element matching the predicate. at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396) at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2073) at de.fraunhofer.aisec.cpg_vis_neo4j.Application.call(Application.kt:583) at de.fraunhofer.aisec.cpg_vis_neo4j.Application.call(Application.kt:100) at picocli.CommandLine.executeUserObject(CommandLine.java:2041) at picocli.CommandLine.access$1500(CommandLine.java:148) at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2461) at picocli.CommandLine$RunLast.handle(CommandLine.java:2453) at picocli.CommandLine$RunLast.handle(CommandLine.java:2415) at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2273) at picocli.CommandLine$RunLast.execute(CommandLine.java:2417) at picocli.CommandLine.execute(CommandLine.java:2170) at de.fraunhofer.aisec.cpg_vis_neo4j.ApplicationKt.main(Application.kt:650) Caused by: java.util.NoSuchElementException: Collection contains no element matching the predicate. at de.fraunhofer.aisec.cpg.passes.quantumcpg.QuantumDFGPass.accept(QuantumDFGPass.kt:312) at de.fraunhofer.aisec.cpg.passes.quantumcpg.QuantumDFGPass.accept(QuantumDFGPass.kt:36) at de.fraunhofer.aisec.cpg.passes.PassKt.executePass(Pass.kt:357) at de.fraunhofer.aisec.cpg.TranslationManager.analyzeNonAsync(TranslationManager.kt:101) at de.fraunhofer.aisec.cpg.TranslationManager.analyze$lambda$0(TranslationManager.kt:69) at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)

carlosgpal commented 1 week ago

And the build returns some failed tests 219.2 > Task :cpg-language-openqasm:test

OpenQASMFrontendTest > testPlaquette() FAILED java.util.concurrent.ExecutionException at OpenQASMFrontendTest.kt:60 Caused by: java.util.NoSuchElementException at _Collections.kt:214

OpenQASMFrontendTest > testAdder() FAILED java.util.concurrent.ExecutionException at OpenQASMFrontendTest.kt:46 Caused by: java.util.NoSuchElementException at QuantumDFGPass.kt:312

OpenQASMFrontendTest > testIf() FAILED java.util.concurrent.ExecutionException at OpenQASMFrontendTest.kt:85 Caused by: java.util.NoSuchElementException at QuantumDFGPass.kt:312

OpenQASMFrontendTest > testMoreOperations() FAILED java.util.concurrent.ExecutionException at OpenQASMFrontendTest.kt:99 Caused by: java.util.NoSuchElementException at QuantumDFGPass.kt:312

KuechA commented 1 week ago

Yeah, one of my changes had some unintended effects and I just reverted it.

carlosgpal commented 1 week ago

works now, thanks