q-convert
Version:
Quantum Computing Language Converter
255 lines (208 loc) • 6.84 kB
JavaScript
const commandLineArgs = require("command-line-args");
const fs = require("fs");
const path = require("path");
const replaceExt = require("replace-ext");
const QuantumCircuit = require("quantum-circuit");
const optionDefinitions = [
{ name: "input", alias: "i", type: String },
{ name: "source", alias: "s", type: String },
{ name: "output", alias: "o", type: String },
{ name: "dest", alias: "d", type: String },
{ name: "jupyter", alias: "j", type: Boolean},
{ name: "overwrite", alias: "w", type: Boolean},
{ name: "help", alias: "h", type: Boolean}
];
const args = commandLineArgs(optionDefinitions);
var printUsage = function() {
console.log("Q-Convert - Quantum Language Converter");
console.log("");
console.log("Usage:");
console.log(" q-convert -i input_file -s source_format -o output_file -d destination_format [-j] [-w]");
console.log(" -i, --input\tInput file");
console.log(" -s, --source\tSource format: qasm, quil, qobj, ionq, quantum-circuit, toaster");
console.log(" -o, --output\tOutput file");
console.log(" -d, --dest\tDestination format: qiskit, qasm, qobj, quil, pyquil, braket, cirq, tfq, qsharp, quest, cudaq, js, quantum-circuit, toaster, svg, svg-inline");
console.log(" -j, --jupyter\tOutput jupyter notebook (for qiskit, pyquil, braket, cirq, tfq, qsharp, cudaq and js only)");
console.log(" -w, --overwrite\tOverwrite output file if it already exists");
console.log(" -h, --help\tPrint this help text");
console.log("");
console.log("Enjoy! :)");
console.log("");
};
if(args.help) {
printUsage();
if(!args.input) {
process.exit(1);
}
}
if(!args.input) {
console.log("Error: please specify input file.");
process.exit(1);
}
if(!fs.existsSync(args.input)) {
console.log("Error: input file \"" + args.input + "\" not found.");
process.exit(1);
}
var inputStat = fs.lstatSync(args.input);
if(!inputStat.isFile()) {
console.log("Error: input \"" + args.input + "\" is not a file.");
process.exit(1);
}
if(!args.output) {
console.log("Error: please specify output file.");
process.exit(1);
}
if(fs.existsSync(args.output)) {
if(!args.overwrite) {
console.log("Error: output file \"" + args.output + "\" already exists.");
console.log("Use -w switch to overwrite.");
process.exit(1);
}
var outputStat = fs.lstatSync(args.output);
if(outputStat.isDirectory()) {
console.log("Error: output \"" + args.output + "\" is not a file.");
process.exit(1);
}
}
if(!args.source) {
console.log("Error: please specify source file format.");
process.exit(1);
}
if(!args.dest) {
console.log("Error: please specify destination file format.");
process.exit(1);
}
// read input file
var inputFile = "";
try {
inputFile = fs.readFileSync(args.input, "utf8");
} catch(e) {
console.log("Error: cannot read input file \"" + args.input + "\". " + e.message);
process.exit(1);
}
var jupyter = !!args.jupyter;
var writeOutput = function(circuit) {
var outputStr = "";
switch(args.dest) {
case "qiskit": outputStr = circuit.exportQiskit("", false, null, null, null, null, jupyter); break;
case "qasm": outputStr = circuit.exportQASM(); break;
case "qasm-ext": outputStr = circuit.exportQASM(null, false, null, false, true); break;
case "qobj": outputStr = JSON.stringify(circuit.exportQobj()); break;
case "quil": outputStr = circuit.exportQuil(); break;
case "pyquil": outputStr = circuit.exportPyquil("", false, null, null, null, null, jupyter); break;
case "braket": outputStr = circuit.exportBraket("", false, null, null, jupyter); break;
case "cudaq": outputStr = circuit.exportCudaQ("", false, null, null, null, null, jupyter); break;
case "cirq": outputStr = circuit.exportCirq("", false, null, null, jupyter); break;
case "tfq": outputStr = circuit.exportTFQ("", false, null, null, jupyter); break;
case "qsharp": outputStr = circuit.exportQSharp("", false, null, null, jupyter); break;
case "js": outputStr = circuit.exportJavaScript("", false, null, jupyter); break;
case "quest": outputStr = circuit.exportQuEST("", false, null, null); break;
case "quantum-circuit": outputStr = JSON.stringify(circuit.save()); break;
case "toaster": outputStr = JSON.stringify(circuit.exportRaw()); break;
case "svg": outputStr = circuit.exportSVG(false); break;
case "svg-inline": outputStr = circuit.exportSVG(true); break;
default: {
console.log("Error: unknown destination format \"" + args.dest + "\".");
process.exit(1);
}
}
try {
fs.writeFileSync(args.output, outputStr, "utf8");
} catch(e) {
console.log("Error: cannot write output \"" + args.output + "\". " + e.message);
process.exit(1);
}
};
var convert = function() {
var circuit = new QuantumCircuit();
switch(args.source) {
case "qasm": {
circuit.importQASM(inputFile, function(errors) {
if(errors && errors.length) {
console.log(errors);
process.exit(1);
}
writeOutput(circuit);
});
}; break;
case "quil": {
circuit.importQuil(inputFile, function(errors) {
if(errors && errors.length) {
console.log(errors);
process.exit(1);
}
});
writeOutput(circuit);
}; break;
case "qobj": {
var inputJson = null;
try {
inputJson = JSON.parse(inputFile);
} catch(err) {
console.log("Error parsing input file as JSON. " + err.message);
process.exit(1);
}
circuit.importQobj(inputJson, function(errors) {
if(errors && errors.length) {
console.log(errors);
process.exit(1);
}
writeOutput(circuit);
});
}; break;
case "ionq": {
var inputJson = null;
try {
inputJson = JSON.parse(inputFile);
} catch(err) {
console.log("Error parsing input file as JSON. " + err.message);
process.exit(1);
}
try {
circuit.importIonq(inputJson);
} catch(err) {
console.log(err);
process.exit(1);
}
writeOutput(circuit);
}; break;
case "quantum-circuit": {
var inputJson = null;
try {
inputJson = JSON.parse(inputFile);
} catch(err) {
console.log("Error parsing input file as JSON. " + err.message);
process.exit(1);
}
try {
circuit.load(inputJson);
} catch(err) {
console.log(err);
process.exit(1);
}
writeOutput(circuit);
}; break;
case "toaster": {
var inputJson = null;
try {
inputJson = JSON.parse(inputFile);
} catch(err) {
console.log("Error parsing input file as JSON. " + err.message);
process.exit(1);
}
circuit.importRaw(inputJson, function(errors) {
if(errors && errors.length) {
console.log(errors);
process.exit(1);
}
writeOutput(circuit);
});
}; break;
default: {
console.log("Error: unknown input file format \"" + args.source + "\".");
process.exit(1);
}
};
};
convert();