Kernel only attribute annotation (#76) #127
|
@ -9,7 +9,7 @@ import nac3artiq
|
|||
|
||||
|
||||
__all__ = [
|
||||
"KernelInvariant", "virtual",
|
||||
"Kernel", "KernelInvariant", "virtual",
|
||||
"round64", "floor64", "ceil64",
|
||||
"extern", "kernel", "portable", "nac3",
|
||||
"ms", "us", "ns",
|
||||
|
@ -21,6 +21,9 @@ __all__ = [
|
|||
|
||||
T = TypeVar('T')
|
||||
|
||||
class Kernel(Generic[T]):
|
||||
pass
|
||||
|
||||
class KernelInvariant(Generic[T]):
|
||||
pass
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ use parking_lot::{Mutex, RwLock};
|
|||
use nac3core::{
|
||||
codegen::{concrete_type::ConcreteTypeStore, CodeGenTask, WithCall, WorkerRegistry},
|
||||
symbol_resolver::SymbolResolver,
|
||||
toplevel::{composer::TopLevelComposer, DefinitionId, GenCall, TopLevelDef},
|
||||
toplevel::{composer::{TopLevelComposer, CoreMode}, DefinitionId, GenCall, TopLevelDef},
|
||||
typecheck::typedef::{FunSignature, FuncArg},
|
||||
typecheck::{type_inferencer::PrimitiveStore, typedef::Type},
|
||||
};
|
||||
|
@ -239,7 +239,7 @@ impl Nac3 {
|
|||
}))),
|
||||
),
|
||||
];
|
||||
let (_, builtins_def, builtins_ty) = TopLevelComposer::new(builtins.clone());
|
||||
let (_, builtins_def, builtins_ty) = TopLevelComposer::new(builtins.clone(), CoreMode::Artiq);
|
||||
|
||||
let builtins_mod = PyModule::import(py, "builtins").unwrap();
|
||||
let id_fn = builtins_mod.getattr("id").unwrap();
|
||||
|
||||
|
@ -375,7 +375,7 @@ impl Nac3 {
|
|||
filename: &str,
|
||||
py: Python,
|
||||
) -> PyResult<()> {
|
||||
let (mut composer, _, _) = TopLevelComposer::new(self.builtins.clone());
|
||||
let (mut composer, _, _) = TopLevelComposer::new(self.builtins.clone(), CoreMode::Artiq);
|
||||
let mut id_to_def = HashMap::new();
|
||||
let mut id_to_type = HashMap::new();
|
||||
|
||||
|
|
|
@ -9,6 +9,11 @@ use crate::{
|
|||
|
||||
use super::*;
|
||||
|
||||
pub enum CoreMode {
|
||||
sb10q
commented
Just make the names configurable. Just make the names configurable.
|
||||
Artiq,
|
||||
Standalone
|
||||
}
|
||||
|
||||
type DefAst = (Arc<RwLock<TopLevelDef>>, Option<ast::Stmt<()>>);
|
||||
pub struct TopLevelComposer {
|
||||
// list of top level definitions, same as top level context
|
||||
|
@ -25,11 +30,13 @@ pub struct TopLevelComposer {
|
|||
pub method_class: HashMap<DefinitionId, DefinitionId>,
|
||||
// number of built-in function and classes in the definition list, later skip
|
||||
pub builtin_num: usize,
|
||||
// indicate the mode that we are using the core
|
||||
sb10q
commented
Misleading comment. I suggest removing it, since it's fairly obvious what this does from the code already. Misleading comment. I suggest removing it, since it's fairly obvious what this does from the code already.
|
||||
pub mode: CoreMode,
|
||||
sb10q
commented
Replace with something like:
Replace with something like:
```
pub kernel_ann: Option<str>,
pub kernel_invariant_ann: str
```
sb10q
commented
And they could default to non-ARTIQ And they could default to non-ARTIQ ``None / "Invariant"``.
|
||||
}
|
||||
|
||||
impl Default for TopLevelComposer {
|
||||
fn default() -> Self {
|
||||
Self::new(vec![]).0
|
||||
Self::new(vec![], CoreMode::Standalone).0
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -38,6 +45,7 @@ impl TopLevelComposer {
|
|||
/// resolver can later figure out primitive type definitions when passed a primitive type name
|
||||
pub fn new(
|
||||
builtins: Vec<(StrRef, FunSignature, Arc<GenCall>)>,
|
||||
mode: CoreMode
|
||||
) -> (Self, HashMap<StrRef, DefinitionId>, HashMap<StrRef, Type>) {
|
||||
let mut primitives = Self::make_primitives();
|
||||
let (mut definition_ast_list, builtin_name_list) = builtins::get_builtins(&mut primitives);
|
||||
|
@ -108,6 +116,7 @@ impl TopLevelComposer {
|
|||
keyword_list,
|
||||
defined_names,
|
||||
method_class,
|
||||
mode
|
||||
},
|
||||
builtin_id,
|
||||
builtin_ty,
|
||||
|
@ -554,7 +563,7 @@ impl TopLevelComposer {
|
|||
unifier,
|
||||
primitives,
|
||||
&mut type_var_to_concrete_def,
|
||||
&self.keyword_list,
|
||||
(&self.keyword_list, &self.mode)
|
||||
)?
|
||||
}
|
||||
}
|
||||
|
@ -827,8 +836,9 @@ impl TopLevelComposer {
|
|||
unifier: &mut Unifier,
|
||||
primitives: &PrimitiveStore,
|
||||
type_var_to_concrete_def: &mut HashMap<Type, TypeAnnotation>,
|
||||
keyword_list: &HashSet<StrRef>,
|
||||
core_info: (&HashSet<StrRef>, &CoreMode),
|
||||
) -> Result<(), String> {
|
||||
let (keyword_list, core_mode) = core_info;
|
||||
let mut class_def = class_def.write();
|
||||
let (
|
||||
class_id,
|
||||
|
@ -1059,19 +1069,26 @@ impl TopLevelComposer {
|
|||
|
||||
sb10q
commented
This is too restrictive. The restriction is worse than the possibility of bugs from the user mutating the list unexpectedly. This is too restrictive. The restriction is worse than the possibility of bugs from the user mutating the list unexpectedly.
|
||||
// handle Kernel[T], KernelInvariant[T]
|
||||
let (annotation, mutable) = {
|
||||
let mut result = None;
|
||||
if let ast::ExprKind::Subscript { value, slice, .. } = &annotation.as_ref().node {
|
||||
if let ast::ExprKind::Name { id, .. } = &value.node {
|
||||
result = if id == &"Kernel".into() {
|
||||
Some((slice, true))
|
||||
} else if id == &"KernelInvariant".into() {
|
||||
Some((slice, false))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
match core_mode {
|
||||
CoreMode::Artiq => match &annotation.as_ref().node {
|
||||
ast::ExprKind::Subscript { value, slice, .. } if matches!(
|
||||
&value.node,
|
||||
ast::ExprKind::Name { id, .. } if id == &"Kernel".into()
|
||||
) => (slice, true),
|
||||
ast::ExprKind::Subscript { value, slice, .. } if matches!(
|
||||
&value.node,
|
||||
sb10q
commented
As before, please remove debug prints. As before, please remove debug prints.
This is also not an error, if it is not annotated with ``Kernel`` or ``KernelInvariant`` it is simply a host-only attribute.
|
||||
ast::ExprKind::Name { id, .. } if id == &"KernelInvariant".into()
|
||||
) => (slice, false),
|
||||
_ => continue // ignore fields annotated otherwise
|
||||
},
|
||||
CoreMode::Standalone => match &annotation.as_ref().node {
|
||||
ast::ExprKind::Subscript { value, slice, .. } if matches!(
|
||||
&value.node,
|
||||
ast::ExprKind::Name { id, .. } if id == &"Invariant".into()
|
||||
) => (slice, false),
|
||||
_ => (annotation, true)
|
||||
}
|
||||
}
|
||||
result.unwrap_or((annotation, true))
|
||||
};
|
||||
class_fields_def.push((*attr, dummy_field_type, mutable));
|
||||
|
||||
|
|
|
@ -3,13 +3,10 @@ use inkwell::{
|
|||
targets::*,
|
||||
OptimizationLevel,
|
||||
};
|
||||
use nac3core::typecheck::{type_inferencer::PrimitiveStore, typedef::{Type, Unifier}};
|
||||
use nac3parser::{ast::{Expr, ExprKind, StmtKind}, parser};
|
||||
use std::{borrow::Borrow, collections::HashMap, env, fs, path::Path, sync::Arc, time::SystemTime};
|
||||
use parking_lot::RwLock;
|
||||
use std::{borrow::Borrow, env};
|
||||
use std::fs;
|
||||
use std::{collections::HashMap, path::Path, sync::Arc, time::SystemTime};
|
||||
|
||||
use nac3parser::{ast::{Expr, ExprKind, StmtKind}, parser};
|
||||
use nac3core::{
|
||||
codegen::{
|
||||
concrete_type::ConcreteTypeStore, CodeGenTask, DefaultCodeGenerator, WithCall,
|
||||
|
@ -17,11 +14,11 @@ use nac3core::{
|
|||
},
|
||||
symbol_resolver::SymbolResolver,
|
||||
toplevel::{
|
||||
composer::TopLevelComposer,
|
||||
composer::{TopLevelComposer, CoreMode},
|
||||
TopLevelDef, helper::parse_parameter_default_value,
|
||||
type_annotation::*,
|
||||
},
|
||||
typecheck::typedef::FunSignature,
|
||||
typecheck::{type_inferencer::PrimitiveStore, typedef::{Type, Unifier, FunSignature}}
|
||||
};
|
||||
|
||||
mod basic_symbol_resolver;
|
||||
|
@ -47,7 +44,10 @@ fn main() {
|
|||
};
|
||||
|
||||
let primitive: PrimitiveStore = TopLevelComposer::make_primitives().0;
|
||||
let (mut composer, builtins_def, builtins_ty) = TopLevelComposer::new(vec![]);
|
||||
let (mut composer, builtins_def, builtins_ty) = TopLevelComposer::new(
|
||||
vec![],
|
||||
CoreMode::Standalone
|
||||
sb10q
commented
You implemented You implemented ``Default`` already - don't repeat yourself?
|
||||
);
|
||||
|
||||
let internal_resolver: Arc<ResolverInternal> = ResolverInternal {
|
||||
id_to_type: builtins_ty.into(),
|
||||
|
|
Loading…
Reference in New Issue
duplication - see comment below