diff --git a/melange/core/src/veriloga/osdi_0_4.rs b/melange/core/src/veriloga/osdi_0_4.rs index 2e7a6143..382d448e 100644 --- a/melange/core/src/veriloga/osdi_0_4.rs +++ b/melange/core/src/veriloga/osdi_0_4.rs @@ -62,6 +62,7 @@ pub const DOMAIN_CONTINUOUS: u32 = 2; pub const NOISE_TYPE_WHITE: u32 = 0; pub const NOISE_TYPE_FLICKER: u32 = 1; pub const NOISE_TYPE_TABLE: u32 = 2; +pub const MODULEFLAG_ABSTIME: u32 = 1; #[repr(C)] pub struct OsdiLimFunction { @@ -195,6 +196,7 @@ pub struct OsdiDescriptor { pub residual_nature: *mut OsdiNatureRef, pub noise_source_type: *mut u32, pub load_noise_params: fn(*mut c_void, *mut c_void, *mut f64, *mut f64), + pub module_flags: u32, } impl OsdiDescriptor { pub fn access( diff --git a/openvaf/openvaf/tests/load/osdi_0_4.rs b/openvaf/openvaf/tests/load/osdi_0_4.rs index 2e7a6143..382d448e 100644 --- a/openvaf/openvaf/tests/load/osdi_0_4.rs +++ b/openvaf/openvaf/tests/load/osdi_0_4.rs @@ -62,6 +62,7 @@ pub const DOMAIN_CONTINUOUS: u32 = 2; pub const NOISE_TYPE_WHITE: u32 = 0; pub const NOISE_TYPE_FLICKER: u32 = 1; pub const NOISE_TYPE_TABLE: u32 = 2; +pub const MODULEFLAG_ABSTIME: u32 = 1; #[repr(C)] pub struct OsdiLimFunction { @@ -195,6 +196,7 @@ pub struct OsdiDescriptor { pub residual_nature: *mut OsdiNatureRef, pub noise_source_type: *mut u32, pub load_noise_params: fn(*mut c_void, *mut c_void, *mut f64, *mut f64), + pub module_flags: u32, } impl OsdiDescriptor { pub fn access( diff --git a/openvaf/osdi/header/osdi_0_4.h b/openvaf/osdi/header/osdi_0_4.h index b927f2a7..544c7a20 100644 --- a/openvaf/osdi/header/osdi_0_4.h +++ b/openvaf/osdi/header/osdi_0_4.h @@ -80,6 +80,8 @@ #define NOISE_TYPE_FLICKER 1 #define NOISE_TYPE_TABLE 2 +#define MODULEFLAG_ABSTIME 1 + typedef struct OsdiLimFunction { char *name; uint32_t num_args; @@ -226,6 +228,7 @@ typedef struct OsdiDescriptor { OsdiNatureRef* residual_nature; uint32_t *noise_source_type; void (*load_noise_params)(void *inst, void *model, double *power, double *exponent); + uint32_t module_flags; }OsdiDescriptor; typedef struct OsdiNature { diff --git a/openvaf/osdi/src/metadata.rs b/openvaf/osdi/src/metadata.rs index c74067e7..2313c134 100644 --- a/openvaf/osdi/src/metadata.rs +++ b/openvaf/osdi/src/metadata.rs @@ -4,7 +4,7 @@ use std::iter::once; use hir::{CompilationDB, ParamSysFun, Type}; use hir_def::db::HirDefDB; use hir_def::ndatable::NDATable; -use hir_lower::CurrentKind; +use hir_lower::{CurrentKind, ParamKind}; use lasso::{Rodeo, Spur}; use llvm_sys::core::{ LLVMConstArray2, LLVMConstInt, LLVMConstPtrToInt, LLVMGetArrayLength2, LLVMGetDataLayoutStr, @@ -34,7 +34,7 @@ use crate::metadata::osdi_0_4::{ JACOBIAN_ENTRY_RESIST, JACOBIAN_ENTRY_RESIST_CONST, NATREF_DISCIPLINE_FLOW, NATREF_DISCIPLINE_POTENTIAL, NATREF_NONE, NOISE_TYPE_FLICKER, NOISE_TYPE_TABLE, NOISE_TYPE_WHITE, PARA_KIND_INST, PARA_KIND_MODEL, PARA_KIND_OPVAR, PARA_TY_INT, PARA_TY_REAL, - PARA_TY_STR, + PARA_TY_STR,MODULEFLAG_ABSTIME, }; use crate::ty_len; @@ -401,6 +401,14 @@ impl<'ll> OsdiCompilationUnit<'_, '_, 'll> { .collect(); let (uvec, rvec) = self.unknown_residual_natures(db); + + let mut module_flags = 0u32; + module.intern.params.iter().for_each(|(p, _)| { + if let ParamKind::Abstime = p { + module_flags |= MODULEFLAG_ABSTIME; + } + }); + OsdiDescriptor { name: module.info.module.name(db), num_nodes: module.dae_system.unknowns.len() as u32, @@ -457,6 +465,7 @@ impl<'ll> OsdiCompilationUnit<'_, '_, 'll> { residual_nature: rvec, noise_source_type, load_noise_params: self.load_noise_params(), + module_flags: module_flags, } } } diff --git a/openvaf/osdi/src/metadata/osdi_0_4.rs b/openvaf/osdi/src/metadata/osdi_0_4.rs index 2b813b67..8b2d5b50 100644 --- a/openvaf/osdi/src/metadata/osdi_0_4.rs +++ b/openvaf/osdi/src/metadata/osdi_0_4.rs @@ -91,6 +91,7 @@ pub const DOMAIN_CONTINUOUS: u32 = 2; pub const NOISE_TYPE_WHITE: u32 = 0; pub const NOISE_TYPE_FLICKER: u32 = 1; pub const NOISE_TYPE_TABLE: u32 = 2; +pub const MODULEFLAG_ABSTIME: u32 = 1; pub struct OsdiLimFunction<'ll> { pub name: String, @@ -415,6 +416,7 @@ pub struct OsdiDescriptor<'ll> { pub residual_nature: Vec, pub noise_source_type: Vec, pub load_noise_params: &'ll llvm_sys::LLVMValue, + pub module_flags: u32, } impl<'ll> OsdiDescriptor<'ll> { pub fn to_ll_val( @@ -483,6 +485,7 @@ impl<'ll> OsdiDescriptor<'ll> { ctx.const_arr_ptr(tys.osdi_nature_ref, &arr_47), ctx.const_arr_ptr(ctx.ty_int(), &arr_48), self.load_noise_params, + ctx.const_unsigned_int(self.module_flags), ]; let ty = tys.osdi_descriptor; ctx.const_struct(ty, &fields) @@ -542,6 +545,7 @@ impl OsdiTyBuilder<'_, '_, '_> { ctx.ty_ptr(), ctx.ty_ptr(), ctx.ty_ptr(), + ctx.ty_int(), ]; let ty = ctx.ty_struct("OsdiDescriptor", &fields); self.osdi_descriptor = Some(ty);