diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..3de71b061d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,48 @@ +name: CI Build and Test + +on: + push: + branches: [main] + pull_request: + branches: [main] + workflow_dispatch: + +env: + CARGO_TERM_COLOR: always + +jobs: + format: + name: Format + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: "true" + - name: Check Formatting + run: cargo fmt -v --all -- --check + + build: + name: CI Build and Test + strategy: + matrix: + os: [windows-latest, ubuntu-latest, macos-latest] + + runs-on: ${{matrix.os}} + + steps: + - uses: actions/checkout@v3 + with: + submodules: "true" + - name: Clippy Lints + run: cargo clippy -vv --all-targets --all-features -- -D warnings + - name: Build + run: cargo build -vv --release + - name: Test + run: cargo test -vv --release -- --nocapture + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + name: ${{matrix.os}} + path: | + target/release/qsc* + !target/release/qsc.d diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..c41cc9e35e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000000..80df0b2a08 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,265 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.139" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" + +[[package]] +name = "llvm-tools" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955be5d0ca0465caf127165acb47964f911e2bc26073e865deb8be7189302faf" + +[[package]] +name = "matrixmultiply" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add85d4dd35074e6fedc608f8c8f513a3548619a9024b751949ef0e8e45a4d84" +dependencies = [ + "rawpointer", +] + +[[package]] +name = "ndarray" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "rawpointer", +] + +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "qir-backend" +version = "0.1.0" +source = "git+https://github.com/qir-alliance/qir-runner?rev=67c2902cd8682976aa7e5b71087a9a03a8889999#67c2902cd8682976aa7e5b71087a9a03a8889999" +dependencies = [ + "bitvec", + "ndarray", + "num-bigint", + "num-complex", + "num-traits", + "qir-stdlib", + "rand", + "rustc-hash", +] + +[[package]] +name = "qir-stdlib" +version = "0.1.0" +source = "git+https://github.com/qir-alliance/qir-runner?rev=67c2902cd8682976aa7e5b71087a9a03a8889999#67c2902cd8682976aa7e5b71087a9a03a8889999" +dependencies = [ + "llvm-tools", + "num-bigint", + "rand", +] + +[[package]] +name = "qsc" +version = "0.0.0" +dependencies = [ + "qsc_ast", + "qsc_codegen", + "qsc_eval", + "qsc_frontend", + "qsc_passes", +] + +[[package]] +name = "qsc_ast" +version = "0.0.0" + +[[package]] +name = "qsc_codegen" +version = "0.0.0" +dependencies = [ + "qsc_ast", + "qsc_frontend", +] + +[[package]] +name = "qsc_eval" +version = "0.0.0" +dependencies = [ + "qir-backend", + "qir-stdlib", + "qsc_ast", + "qsc_frontend", +] + +[[package]] +name = "qsc_frontend" +version = "0.0.0" +dependencies = [ + "qsc_ast", +] + +[[package]] +name = "qsc_passes" +version = "0.0.0" +dependencies = [ + "qsc_ast", + "qsc_frontend", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000000..933561010a --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[workspace] +members = [ + "compiler/qsc", + "compiler/qsc_ast", + "compiler/qsc_codegen", + "compiler/qsc_eval", + "compiler/qsc_frontend", + "compiler/qsc_passes", +] + +[profile.release] +debug = 1 \ No newline at end of file diff --git a/compiler/qsc/Cargo.toml b/compiler/qsc/Cargo.toml new file mode 100644 index 0000000000..dfcc191e62 --- /dev/null +++ b/compiler/qsc/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "qsc" +version = "0.0.0" +edition = "2021" + +[dependencies] +qsc_ast = { path = "../qsc_ast" } +qsc_frontend = { path = "../qsc_frontend" } +qsc_passes = { path = "../qsc_passes" } +qsc_codegen = { path = "../qsc_codegen" } +qsc_eval = { path = "../qsc_eval" } \ No newline at end of file diff --git a/compiler/qsc/src/main.rs b/compiler/qsc/src/main.rs new file mode 100644 index 0000000000..3f1aa42a89 --- /dev/null +++ b/compiler/qsc/src/main.rs @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#![warn(clippy::pedantic)] + +fn main() { + println!("Hello, world!"); +} diff --git a/compiler/qsc_ast/Cargo.toml b/compiler/qsc_ast/Cargo.toml new file mode 100644 index 0000000000..20dd040a34 --- /dev/null +++ b/compiler/qsc_ast/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "qsc_ast" +version = "0.0.0" +edition = "2021" + +[dependencies] diff --git a/compiler/qsc_ast/src/lib.rs b/compiler/qsc_ast/src/lib.rs new file mode 100644 index 0000000000..fc7aaf15df --- /dev/null +++ b/compiler/qsc_ast/src/lib.rs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#![warn(clippy::pedantic)] + +#[must_use] +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/compiler/qsc_codegen/Cargo.toml b/compiler/qsc_codegen/Cargo.toml new file mode 100644 index 0000000000..ac3eda25e7 --- /dev/null +++ b/compiler/qsc_codegen/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "qsc_codegen" +version = "0.0.0" +edition = "2021" + +[dependencies] +qsc_ast = { path = "../qsc_ast" } +qsc_frontend = { path = "../qsc_frontend" } +# LLVM dependency here... \ No newline at end of file diff --git a/compiler/qsc_codegen/src/lib.rs b/compiler/qsc_codegen/src/lib.rs new file mode 100644 index 0000000000..fc7aaf15df --- /dev/null +++ b/compiler/qsc_codegen/src/lib.rs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#![warn(clippy::pedantic)] + +#[must_use] +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/compiler/qsc_eval/Cargo.toml b/compiler/qsc_eval/Cargo.toml new file mode 100644 index 0000000000..16f0e66fa3 --- /dev/null +++ b/compiler/qsc_eval/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "qsc_eval" +version = "0.0.0" +edition = "2021" + +[dependencies] +qsc_ast = { path = "../qsc_ast" } +qsc_frontend = { path = "../qsc_frontend" } +qir-backend = { git = "https://github.com/qir-alliance/qir-runner", rev = "67c2902cd8682976aa7e5b71087a9a03a8889999" } +qir-stdlib = { git = "https://github.com/qir-alliance/qir-runner", rev = "67c2902cd8682976aa7e5b71087a9a03a8889999", features = ["disable-range-support"] } diff --git a/compiler/qsc_eval/src/lib.rs b/compiler/qsc_eval/src/lib.rs new file mode 100644 index 0000000000..fc7aaf15df --- /dev/null +++ b/compiler/qsc_eval/src/lib.rs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#![warn(clippy::pedantic)] + +#[must_use] +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/compiler/qsc_frontend/Cargo.toml b/compiler/qsc_frontend/Cargo.toml new file mode 100644 index 0000000000..5d32a9a8c0 --- /dev/null +++ b/compiler/qsc_frontend/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "qsc_frontend" +version = "0.0.0" +edition = "2021" + +[dependencies] +qsc_ast = { path = "../qsc_ast" } diff --git a/compiler/qsc_frontend/src/lib.rs b/compiler/qsc_frontend/src/lib.rs new file mode 100644 index 0000000000..fc7aaf15df --- /dev/null +++ b/compiler/qsc_frontend/src/lib.rs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#![warn(clippy::pedantic)] + +#[must_use] +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/compiler/qsc_passes/Cargo.toml b/compiler/qsc_passes/Cargo.toml new file mode 100644 index 0000000000..c537c8b4ca --- /dev/null +++ b/compiler/qsc_passes/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "qsc_passes" +version = "0.0.0" +edition = "2021" + +[dependencies] +qsc_ast = { path = "../qsc_ast" } +qsc_frontend = { path = "../qsc_frontend" } diff --git a/compiler/qsc_passes/src/lib.rs b/compiler/qsc_passes/src/lib.rs new file mode 100644 index 0000000000..fc7aaf15df --- /dev/null +++ b/compiler/qsc_passes/src/lib.rs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#![warn(clippy::pedantic)] + +#[must_use] +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +}