microsoft/qdk

Public

mirrored fromhttps://github.com/microsoft/qdkAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
billti/bloch

Branches

Tags

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

Clone

HTTPS

Download ZIP

compiler/qsc/src/codegen.rs

158lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4#[cfg(test)]
5mod tests;
6
7pub mod qsharp {
8 pub use qsc_codegen::qsharp::write_package_string;
9 pub use qsc_codegen::qsharp::write_stmt_string;
10}
11
12pub mod qir {
13 use qsc_codegen::qir::fir_to_qir;
14
15 use qsc_data_structures::{language_features::LanguageFeatures, target::TargetCapabilityFlags};
16 use qsc_frontend::{
17 compile::{Dependencies, PackageStore, SourceMap},
18 error::WithSource,
19 };
20 use qsc_partial_eval::ProgramEntry;
21 use qsc_passes::{PackageType, PassContext};
22
23 use crate::interpret::Error;
24 pub fn get_qir_from_ast(
25 store: &mut PackageStore,
26 dependencies: &Dependencies,
27 ast_package: qsc_ast::ast::Package,
28 sources: SourceMap,
29 capabilities: TargetCapabilityFlags,
30 ) -> Result<String, Vec<Error>> {
31 if capabilities == TargetCapabilityFlags::all() {
32 return Err(vec![Error::UnsupportedRuntimeCapabilities]);
33 }
34
35 let (unit, errors) = crate::compile::compile_ast(
36 store,
37 dependencies,
38 ast_package,
39 sources,
40 PackageType::Exe,
41 capabilities,
42 );
43
44 // Ensure it compiles before trying to add it to the store.
45 if !errors.is_empty() {
46 return Err(errors.iter().map(|e| Error::Compile(e.clone())).collect());
47 }
48
49 let package_id = store.insert(unit);
50 let (fir_store, fir_package_id) = qsc_passes::lower_hir_to_fir(store, package_id);
51 let package = fir_store.get(fir_package_id);
52 let entry = ProgramEntry {
53 exec_graph: package.entry_exec_graph.clone(),
54 expr: (
55 fir_package_id,
56 package
57 .entry
58 .expect("package must have an entry expression"),
59 )
60 .into(),
61 };
62
63 let compute_properties = PassContext::run_fir_passes_on_fir(
64 &fir_store,
65 fir_package_id,
66 capabilities,
67 )
68 .map_err(|errors| {
69 let source_package = store.get(package_id).expect("package should be in store");
70 errors
71 .iter()
72 .map(|e| Error::Pass(WithSource::from_map(&source_package.sources, e.clone())))
73 .collect::<Vec<_>>()
74 })?;
75
76 fir_to_qir(&fir_store, capabilities, Some(compute_properties), &entry).map_err(|e| {
77 let source_package_id = match e.span() {
78 Some(span) => span.package,
79 None => package_id,
80 };
81 let source_package = store
82 .get(source_package_id)
83 .expect("package should be in store");
84 vec![Error::PartialEvaluation(WithSource::from_map(
85 &source_package.sources,
86 e,
87 ))]
88 })
89 }
90 pub fn get_qir(
91 sources: SourceMap,
92 language_features: LanguageFeatures,
93 capabilities: TargetCapabilityFlags,
94 mut package_store: PackageStore,
95 dependencies: &Dependencies,
96 ) -> Result<String, Vec<Error>> {
97 if capabilities == TargetCapabilityFlags::all() {
98 return Err(vec![Error::UnsupportedRuntimeCapabilities]);
99 }
100
101 let (unit, errors) = crate::compile::compile(
102 &package_store,
103 dependencies,
104 sources,
105 PackageType::Exe,
106 capabilities,
107 language_features,
108 );
109
110 // Ensure it compiles before trying to add it to the store.
111 if !errors.is_empty() {
112 return Err(errors.iter().map(|e| Error::Compile(e.clone())).collect());
113 }
114
115 let package_id = package_store.insert(unit);
116 let (fir_store, fir_package_id) = qsc_passes::lower_hir_to_fir(&package_store, package_id);
117 let package = fir_store.get(fir_package_id);
118 let entry = ProgramEntry {
119 exec_graph: package.entry_exec_graph.clone(),
120 expr: (
121 fir_package_id,
122 package
123 .entry
124 .expect("package must have an entry expression"),
125 )
126 .into(),
127 };
128
129 let compute_properties = PassContext::run_fir_passes_on_fir(
130 &fir_store,
131 fir_package_id,
132 capabilities,
133 )
134 .map_err(|errors| {
135 let source_package = package_store
136 .get(package_id)
137 .expect("package should be in store");
138 errors
139 .iter()
140 .map(|e| Error::Pass(WithSource::from_map(&source_package.sources, e.clone())))
141 .collect::<Vec<_>>()
142 })?;
143
144 fir_to_qir(&fir_store, capabilities, Some(compute_properties), &entry).map_err(|e| {
145 let source_package_id = match e.span() {
146 Some(span) => span.package,
147 None => package_id,
148 };
149 let source_package = package_store
150 .get(source_package_id)
151 .expect("package should be in store");
152 vec![Error::PartialEvaluation(WithSource::from_map(
153 &source_package.sources,
154 e,
155 ))]
156 })
157 }
158}
159