microsoft/qdk

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
cesarzc/hw-provider-package

Branches

Tags

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

Clone

HTTPS

Download ZIP

compiler/qsc/src/codegen.rs

83lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4#[cfg(test)]
5mod tests;
6
7use qsc_codegen::qir::fir_to_qir;
8use qsc_data_structures::{language_features::LanguageFeatures, target::TargetCapabilityFlags};
9use qsc_frontend::{
10 compile::{Dependencies, PackageStore, SourceMap},
11 error::WithSource,
12};
13use qsc_partial_eval::ProgramEntry;
14use qsc_passes::{PackageType, PassContext};
15
16use crate::interpret::Error;
17
18pub fn get_qir(
19 sources: SourceMap,
20 language_features: LanguageFeatures,
21 capabilities: TargetCapabilityFlags,
22 mut package_store: PackageStore,
23 dependencies: &Dependencies,
24) -> Result<String, Vec<Error>> {
25 if capabilities == TargetCapabilityFlags::all() {
26 return Err(vec![Error::UnsupportedRuntimeCapabilities]);
27 }
28
29 let (unit, errors) = crate::compile::compile(
30 &package_store,
31 dependencies,
32 sources,
33 PackageType::Exe,
34 capabilities,
35 language_features,
36 );
37
38 // Ensure it compiles before trying to add it to the store.
39 if !errors.is_empty() {
40 return Err(errors.iter().map(|e| Error::Compile(e.clone())).collect());
41 }
42
43 let package_id = package_store.insert(unit);
44 let (fir_store, fir_package_id) = qsc_passes::lower_hir_to_fir(&package_store, package_id);
45 let package = fir_store.get(fir_package_id);
46 let entry = ProgramEntry {
47 exec_graph: package.entry_exec_graph.clone(),
48 expr: (
49 fir_package_id,
50 package
51 .entry
52 .expect("package must have an entry expression"),
53 )
54 .into(),
55 };
56
57 let compute_properties =
58 PassContext::run_fir_passes_on_fir(&fir_store, fir_package_id, capabilities).map_err(
59 |errors| {
60 let source_package = package_store
61 .get(package_id)
62 .expect("package should be in store");
63 errors
64 .iter()
65 .map(|e| Error::Pass(WithSource::from_map(&source_package.sources, e.clone())))
66 .collect::<Vec<_>>()
67 },
68 )?;
69
70 fir_to_qir(&fir_store, capabilities, Some(compute_properties), &entry).map_err(|e| {
71 let source_package_id = match e.span() {
72 Some(span) => span.package,
73 None => package_id,
74 };
75 let source_package = package_store
76 .get(source_package_id)
77 .expect("package should be in store");
78 vec![Error::PartialEvaluation(WithSource::from_map(
79 &source_package.sources,
80 e,
81 ))]
82 })
83}
84