microsoft/qdk

Public

mirrored from https://github.com/microsoft/qdkAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v1.20.0

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

source/compiler/qsc/src/codegen.rs

211lines · modeblame

18718319Ian Davis2 years ago1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
da3795dcIan Davis2 years ago4#[cfg(test)]
5mod tests;
6
83aa5c2bIan Davis1 years ago7pub mod qsharp {
8pub use qsc_codegen::qsharp::write_package_string;
9pub use qsc_codegen::qsharp::write_stmt_string;
10}
18718319Ian Davis2 years ago11
83aa5c2bIan Davis1 years ago12pub mod qir {
c6d74f61Ian Davis1 years ago13use qsc_codegen::qir::{fir_to_qir, fir_to_rir};
18718319Ian Davis2 years ago14
83aa5c2bIan Davis1 years ago15use qsc_data_structures::{language_features::LanguageFeatures, target::TargetCapabilityFlags};
16use qsc_frontend::{
17compile::{Dependencies, PackageStore, SourceMap},
18error::WithSource,
19};
20use qsc_partial_eval::ProgramEntry;
21use qsc_passes::{PackageType, PassContext};
18718319Ian Davis2 years ago22
83aa5c2bIan Davis1 years ago23use crate::interpret::Error;
24pub fn get_qir_from_ast(
25store: &mut PackageStore,
26dependencies: &Dependencies,
27ast_package: qsc_ast::ast::Package,
28sources: SourceMap,
29capabilities: TargetCapabilityFlags,
30) -> Result<String, Vec<Error>> {
31if capabilities == TargetCapabilityFlags::all() {
32return Err(vec![Error::UnsupportedRuntimeCapabilities]);
33}
18718319Ian Davis2 years ago34
83aa5c2bIan Davis1 years ago35let (unit, errors) = crate::compile::compile_ast(
36store,
37dependencies,
38ast_package,
39sources,
40PackageType::Exe,
41capabilities,
42);
18718319Ian Davis2 years ago43
83aa5c2bIan Davis1 years ago44// Ensure it compiles before trying to add it to the store.
45if !errors.is_empty() {
46return Err(errors.iter().map(|e| Error::Compile(e.clone())).collect());
47}
48
49let package_id = store.insert(unit);
50let (fir_store, fir_package_id) = qsc_passes::lower_hir_to_fir(store, package_id);
51let package = fir_store.get(fir_package_id);
52let entry = ProgramEntry {
53exec_graph: package.entry_exec_graph.clone(),
54expr: (
55fir_package_id,
56package
57.entry
58.expect("package must have an entry expression"),
59)
60.into(),
61};
62
63let compute_properties = PassContext::run_fir_passes_on_fir(
64&fir_store,
411a3a20Ian Davis2 years ago65fir_package_id,
83aa5c2bIan Davis1 years ago66capabilities,
411a3a20Ian Davis2 years ago67)
83aa5c2bIan Davis1 years ago68.map_err(|errors| {
69let source_package = store.get(package_id).expect("package should be in store");
70errors
71.iter()
72.map(|e| Error::Pass(WithSource::from_map(&source_package.sources, e.clone())))
73.collect::<Vec<_>>()
74})?;
da3795dcIan Davis2 years ago75
83aa5c2bIan Davis1 years ago76fir_to_qir(&fir_store, capabilities, Some(compute_properties), &entry).map_err(|e| {
77let source_package_id = match e.span() {
78Some(span) => span.package,
79None => package_id,
80};
81let source_package = store
82.get(source_package_id)
83.expect("package should be in store");
84vec![Error::PartialEvaluation(WithSource::from_map(
85&source_package.sources,
86e,
87))]
88})
89}
c6d74f61Ian Davis1 years ago90
91pub fn get_rir(
92sources: SourceMap,
93language_features: LanguageFeatures,
94capabilities: TargetCapabilityFlags,
95mut package_store: PackageStore,
96dependencies: &Dependencies,
97) -> Result<Vec<String>, Vec<Error>> {
98let (package_id, fir_store, entry, compute_properties) = compile_to_fir(
99sources,
100language_features,
101capabilities,
102&mut package_store,
103dependencies,
104)?;
105
106let (raw, ssa) = fir_to_rir(&fir_store, capabilities, Some(compute_properties), &entry)
107.map_err(|e| {
108let source_package_id = match e.span() {
109Some(span) => span.package,
110None => package_id,
111};
112let source_package = package_store
113.get(source_package_id)
114.expect("package should be in store");
115vec![Error::PartialEvaluation(WithSource::from_map(
116&source_package.sources,
117e,
118))]
119})?;
120Ok(vec![raw.to_string(), ssa.to_string()])
121}
122
83aa5c2bIan Davis1 years ago123pub fn get_qir(
124sources: SourceMap,
125language_features: LanguageFeatures,
126capabilities: TargetCapabilityFlags,
127mut package_store: PackageStore,
128dependencies: &Dependencies,
129) -> Result<String, Vec<Error>> {
c6d74f61Ian Davis1 years ago130let (package_id, fir_store, entry, compute_properties) = compile_to_fir(
131sources,
132language_features,
133capabilities,
134&mut package_store,
135dependencies,
136)?;
137
138fir_to_qir(&fir_store, capabilities, Some(compute_properties), &entry).map_err(|e| {
139let source_package_id = match e.span() {
140Some(span) => span.package,
141None => package_id,
142};
143let source_package = package_store
144.get(source_package_id)
145.expect("package should be in store");
146vec![Error::PartialEvaluation(WithSource::from_map(
147&source_package.sources,
148e,
149))]
150})
151}
152
153fn compile_to_fir(
154sources: SourceMap,
155language_features: LanguageFeatures,
156capabilities: TargetCapabilityFlags,
157package_store: &mut PackageStore,
158dependencies: &[(qsc_hir::hir::PackageId, Option<std::sync::Arc<str>>)],
159) -> Result<
160(
161qsc_hir::hir::PackageId,
162qsc_fir::fir::PackageStore,
163ProgramEntry,
164qsc_rca::PackageStoreComputeProperties,
165),
166Vec<Error>,
167> {
83aa5c2bIan Davis1 years ago168if capabilities == TargetCapabilityFlags::all() {
169return Err(vec![Error::UnsupportedRuntimeCapabilities]);
170}
171let (unit, errors) = crate::compile::compile(
c6d74f61Ian Davis1 years ago172package_store,
83aa5c2bIan Davis1 years ago173dependencies,
174sources,
175PackageType::Exe,
176capabilities,
177language_features,
178);
179if !errors.is_empty() {
180return Err(errors.iter().map(|e| Error::Compile(e.clone())).collect());
181}
182let package_id = package_store.insert(unit);
c6d74f61Ian Davis1 years ago183let (fir_store, fir_package_id) = qsc_passes::lower_hir_to_fir(package_store, package_id);
83aa5c2bIan Davis1 years ago184let package = fir_store.get(fir_package_id);
185let entry = ProgramEntry {
186exec_graph: package.entry_exec_graph.clone(),
187expr: (
188fir_package_id,
189package
190.entry
191.expect("package must have an entry expression"),
192)
193.into(),
8197139aCésar Zaragoza Cortés2 years ago194};
83aa5c2bIan Davis1 years ago195let compute_properties = PassContext::run_fir_passes_on_fir(
196&fir_store,
197fir_package_id,
198capabilities,
199)
200.map_err(|errors| {
201let source_package = package_store
202.get(package_id)
203.expect("package should be in store");
204errors
205.iter()
206.map(|e| Error::Pass(WithSource::from_map(&source_package.sources, e.clone())))
207.collect::<Vec<_>>()
208})?;
c6d74f61Ian Davis1 years ago209Ok((package_id, fir_store, entry, compute_properties))
83aa5c2bIan Davis1 years ago210}
18718319Ian Davis2 years ago211}