AnalysisArchitecture.hs revision 8528053a6a766c3614276df0f59fb2a2e8ab6d18
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian MaederModule : $Header$
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian MaederDescription : static analysis of CASL architectural specifications
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian MaederCopyright : (c) Maciek Makowski, Warsaw University, C. Maeder 2004-2006
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian MaederLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
b4fbc96e05117839ca409f5f20f97b3ac872d1edTill MossakowskiMaintainer : till@informatik.uni-bremen.de
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian MaederStability : provisional
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian MaederPortability : non-portable (via imports)
f3a94a197960e548ecd6520bb768cb0d547457bbChristian MaederStatic analysis of CASL architectural specifications
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder Follows the extended static semantics sketched in Chap. III:5.6
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder of the CASL Reference Manual.
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder ( ana_ARCH_SPEC
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder , ana_UNIT_SPEC
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder , ana_UNIT_REF
7b27b67b1c8516d7ccf1610a17fec93662d6a93fChristian Maederimport qualified Data.Map as Map
bec7e681b0ba4d085638ec7af0cf7ae5068840caChristian Maederimport Data.Graph.Inductive.Graph as Graph (Node)
bec7e681b0ba4d085638ec7af0cf7ae5068840caChristian Maeder-- | Analyse an architectural specification
bec7e681b0ba4d085638ec7af0cf7ae5068840caChristian Maeder-- ARCH-SPEC ::= BASIC-ARCH-SPEC | GROUP-ARCH-SPEC | ARCH-SPEC-NAME
bec7e681b0ba4d085638ec7af0cf7ae5068840caChristian Maederana_ARCH_SPEC :: LogicGraph
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maeder -> HetcatsOpts -- ^ should only the structure be analysed?
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maeder -> ARCH_SPEC -> Result (ArchSig, DGraph, ARCH_SPEC)
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maeder{- ^ returns 1. the architectural signature of given ARCH-SPEC
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maeder2. development graph resulting from structured specs within the arch
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maederspec and 3. ARCH_SPEC after possible conversions -}
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maederana_ARCH_SPEC lgraph dg opts archSp = case archSp of
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maeder Basic_arch_spec udd uexpr pos ->
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maeder do (uctx, dg', udd') <- ana_UNIT_DECL_DEFNS lgraph dg opts udd
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maeder (_, usig, _, dg'', uexpr') <-
bec7e681b0ba4d085638ec7af0cf7ae5068840caChristian Maeder ana_UNIT_EXPRESSION lgraph dg' opts uctx (item uexpr)
bec7e681b0ba4d085638ec7af0cf7ae5068840caChristian Maeder return (ArchSig (ctx uctx) usig, dg'', Basic_arch_spec udd'
bec7e681b0ba4d085638ec7af0cf7ae5068840caChristian Maeder (replaceAnnoted uexpr' uexpr) pos)
bec7e681b0ba4d085638ec7af0cf7ae5068840caChristian Maeder Group_arch_spec asp _ -> ana_ARCH_SPEC lgraph dg opts (item asp)
bec7e681b0ba4d085638ec7af0cf7ae5068840caChristian Maeder Arch_spec_name asn@(Token astr pos) -> case lookupGlobalEnvDG asn dg of
bec7e681b0ba4d085638ec7af0cf7ae5068840caChristian Maeder Just (ArchEntry asig) -> return (asig, dg, archSp)
bec7e681b0ba4d085638ec7af0cf7ae5068840caChristian Maeder _ -> fatal_error (astr ++
bec7e681b0ba4d085638ec7af0cf7ae5068840caChristian Maeder " is not an architectural specification") pos
a255351561838b3743d03c1629d335cfb8b83804Christian Maeder-- | Analyse a list of unit declarations and definitions
a255351561838b3743d03c1629d335cfb8b83804Christian Maederana_UNIT_DECL_DEFNS :: LogicGraph -> DGraph
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maeder -> HetcatsOpts -> [Annoted UNIT_DECL_DEFN]
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maeder -> Result (ExtStUnitCtx, DGraph, [Annoted UNIT_DECL_DEFN])
a255351561838b3743d03c1629d335cfb8b83804Christian Maeder{- ^ returns 1. extended static unit context 2. possibly modified
a255351561838b3743d03c1629d335cfb8b83804Christian Maederdevelopment graph 3. possibly modified list of unit declarations and
a255351561838b3743d03c1629d335cfb8b83804Christian Maederdefinitions -}
a255351561838b3743d03c1629d335cfb8b83804Christian Maederana_UNIT_DECL_DEFNS lgraph dg opts udds =
f7d2e793728bbb7fd185e027eb9dfd7b9dd11c21Christian Maeder ana_UNIT_DECL_DEFNS' lgraph dg opts emptyExtStUnitCtx udds
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maederana_UNIT_DECL_DEFNS' :: LogicGraph -> DGraph
f7d2e793728bbb7fd185e027eb9dfd7b9dd11c21Christian Maeder -> HetcatsOpts -> ExtStUnitCtx -> [Annoted UNIT_DECL_DEFN]
02a2037f53b925617df45eb62ca743d777672265Klaus Luettich -> Result (ExtStUnitCtx, DGraph, [Annoted UNIT_DECL_DEFN])
02a2037f53b925617df45eb62ca743d777672265Klaus Luettichana_UNIT_DECL_DEFNS' lgraph dg opts uctx uds = case uds of
02a2037f53b925617df45eb62ca743d777672265Klaus Luettich udd : udds -> do
02a2037f53b925617df45eb62ca743d777672265Klaus Luettich (uctx', dg', udd') <-
02a2037f53b925617df45eb62ca743d777672265Klaus Luettich ana_UNIT_DECL_DEFN lgraph dg opts uctx (item udd)
f7d2e793728bbb7fd185e027eb9dfd7b9dd11c21Christian Maeder (uctx'', dg'', udds') <-
5908cc06d7a3f4dd46d2d7c7fe0fad43b6cd921fChristian Maeder ana_UNIT_DECL_DEFNS' lgraph dg' opts uctx' udds
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder return (uctx'', dg'', (replaceAnnoted udd' udd) : udds')
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder [] -> return (uctx, dg, [])
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian MaederalreadyDefinedUnit :: SIMPLE_ID -> String
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian MaederalreadyDefinedUnit u = "Unit " ++ tokStr u ++ " already declared/defined"
e935423c16e00af45bffbe131f4bd9ae01853fcbChristian Maeder-- | Create a node that represents a union of signatures
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian MaedernodeSigUnion :: LogicGraph -> DGraph -> [MaybeNode] -> DGOrigin
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder -> Result (NodeSig, DGraph)
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian MaedernodeSigUnion lgraph dg nodeSigs orig =
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder do sigUnion@(G_sign lid sigU ind) <- gsigManyUnion lgraph
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder $ map getMaybeSig nodeSigs
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder let nodeContents = newNodeLab emptyNodeName orig
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder $ noSensGTheory lid sigU ind
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder node = getNewNodeDG dg
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder dg' = insNodeDG (node, nodeContents) dg
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder inslink dgres nsig = do
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder EmptyNode _ -> dgres
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder JustNode (NodeSig n sig) -> do
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder incl <- ginclusion lgraph sig sigUnion
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder return $ insEdgeDG (n, node, DGLink
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder { dgl_morphism = incl
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder , dgl_type = GlobalDef
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder , dgl_origin = SeeTarget
f7d2e793728bbb7fd185e027eb9dfd7b9dd11c21Christian Maeder , dgl_id = getNewEdgeId dgv
a255351561838b3743d03c1629d335cfb8b83804Christian Maeder dg'' <- foldl inslink (return dg') nodeSigs
f7d2e793728bbb7fd185e027eb9dfd7b9dd11c21Christian Maeder return (NodeSig node sigUnion, dg'')
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder-- | Analyse unit refs
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maederana_UNIT_REF :: LogicGraph -> DGraph
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder -> HetcatsOpts -> ExtStUnitCtx -> UNIT_REF
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder -> Result (ExtStUnitCtx, DGraph, UNIT_REF)
e935423c16e00af45bffbe131f4bd9ae01853fcbChristian Maeder{- ^ returns 1. extended static unit context 2. possibly modified
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maederdevelopment graph 3. possibly modified UNIT_DECL_DEFN -}
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder-- unit declaration
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maederana_UNIT_REF lgraph dg opts
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder uctx@(buc, _) (Unit_ref un@(Token ustr unpos) usp pos) =
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder do (dns, diag', dg', _) <-
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder ana_UNIT_IMPORTED lgraph dg opts uctx pos []
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder let impSig = toMaybeNode dns
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder (usig, dg'', usp') <-
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder ana_REF_SPEC lgraph dg' opts impSig usp
e935423c16e00af45bffbe131f4bd9ae01853fcbChristian Maeder let ud' = Unit_ref un usp' pos
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder then plain_error (uctx, dg'', ud') (alreadyDefinedUnit un) unpos
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder else case usig of
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder ParUnitSig argSigs resultSig ->
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder do (resultSig', dg''') <- nodeSigUnion lgraph dg''
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder (JustNode resultSig : [impSig]) DGImports
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder let basedParUSig = Based_par_unit_sig dns $
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder ParUnitSig argSigs resultSig'
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder return ((Map.insert un basedParUSig buc, diag'),
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder UnitSig nsig ->
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder do (nsig', dg''') <- nodeSigUnion lgraph dg''
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder (impSig : [JustNode nsig]) DGImports
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder (dn', diag'') <- extendDiagramIncl lgraph diag' []
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder return ((Map.insert un (Based_unit_sig dn') buc, diag'')
88ece6e49930670e8fd3ee79c89a2e918d2fbd0cChristian Maeder , dg''', ud')
88ece6e49930670e8fd3ee79c89a2e918d2fbd0cChristian Maeder-- | Analyse unit declaration or definition
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maederana_UNIT_DECL_DEFN :: LogicGraph -> DGraph
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder -> HetcatsOpts -> ExtStUnitCtx -> UNIT_DECL_DEFN
91f4f0335ac32768d819e202263f713aef5d7fe6Christian Maeder -> Result (ExtStUnitCtx, DGraph, UNIT_DECL_DEFN)
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder{- ^ returns 1. extended static unit context 2. possibly modified
36fcac4cf0f6a1f8a0fee696ac7f4b91d769843cChristian Maederdevelopment graph 3. possibly modified UNIT_DECL_DEFN -}
0678d323bee844db79af13113ae252546629a594Christian Maederana_UNIT_DECL_DEFN lgraph dg opts uctx@(buc, _) udd = case udd of
0678d323bee844db79af13113ae252546629a594Christian Maeder Unit_decl un@(Token ustr unpos) usp uts pos -> do
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder (dns, diag', dg', uts') <-
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder ana_UNIT_IMPORTED lgraph dg opts uctx pos uts
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder let impSig = toMaybeNode dns
0678d323bee844db79af13113ae252546629a594Christian Maeder (usig, dg'', usp') <-
0678d323bee844db79af13113ae252546629a594Christian Maeder ana_REF_SPEC lgraph dg' opts impSig usp
0678d323bee844db79af13113ae252546629a594Christian Maeder let ud' = Unit_decl un usp' uts' pos
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder then plain_error (uctx, dg'', ud') (alreadyDefinedUnit un) unpos
36fcac4cf0f6a1f8a0fee696ac7f4b91d769843cChristian Maeder else case usig of
0678d323bee844db79af13113ae252546629a594Christian Maeder ParUnitSig argSigs resultSig ->
0678d323bee844db79af13113ae252546629a594Christian Maeder do (resultSig', dg''') <- nodeSigUnion lgraph dg''
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder (JustNode resultSig : [impSig]) DGImports
b7b2eb9d574f5ed3ac3e9e1d7a5f168ed78a0604Till Mossakowski let basedParUSig = Based_par_unit_sig dns $
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder ParUnitSig argSigs resultSig'
0678d323bee844db79af13113ae252546629a594Christian Maeder return ((Map.insert un basedParUSig buc, diag'),
0678d323bee844db79af13113ae252546629a594Christian Maeder UnitSig nsig ->
0678d323bee844db79af13113ae252546629a594Christian Maeder do (nsig', dg''') <- nodeSigUnion lgraph dg''
0678d323bee844db79af13113ae252546629a594Christian Maeder (impSig : [JustNode nsig]) DGImports
0678d323bee844db79af13113ae252546629a594Christian Maeder (dn', diag'') <- extendDiagramIncl lgraph diag'
0678d323bee844db79af13113ae252546629a594Christian Maeder JustDiagNode dn -> [dn]
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder _ -> []) nsig' ustr
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder return ((Map.insert un (Based_unit_sig dn') buc, diag'')
b7b2eb9d574f5ed3ac3e9e1d7a5f168ed78a0604Till Mossakowski , dg''', ud')
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder Unit_defn un uexp poss -> do
0678d323bee844db79af13113ae252546629a594Christian Maeder (p, usig, diag, dg', uexp') <-
0678d323bee844db79af13113ae252546629a594Christian Maeder ana_UNIT_EXPRESSION lgraph dg opts uctx uexp
0678d323bee844db79af13113ae252546629a594Christian Maeder let ud' = Unit_defn un uexp' poss
0678d323bee844db79af13113ae252546629a594Christian Maeder {- it's sufficient to check that un is not mapped in buc, we
0678d323bee844db79af13113ae252546629a594Christian Maeder don't need to convert the ExtStUnitCtx to StUnitCtx as the
d183a4514d8a5b6a5d48d15a8dff52d0c96691eaChristian Maeder domain will be preserved -}
0678d323bee844db79af13113ae252546629a594Christian Maeder plain_error (uctx, dg', ud') (alreadyDefinedUnit un) $ tokPos un
0678d323bee844db79af13113ae252546629a594Christian Maeder else case usig of
0678d323bee844db79af13113ae252546629a594Christian Maeder {- we can use Map.insert as there are no mappings for
0678d323bee844db79af13113ae252546629a594Christian Maeder un in ps and bs (otherwise there would have been a
0678d323bee844db79af13113ae252546629a594Christian Maeder mapping in (ctx uctx)) -}
0678d323bee844db79af13113ae252546629a594Christian Maeder UnitSig _ -> case p of
0678d323bee844db79af13113ae252546629a594Christian Maeder JustDiagNode dn -> return ((Map.insert un
0678d323bee844db79af13113ae252546629a594Christian Maeder (Based_unit_sig dn) buc, diag), dg', ud')
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maeder _ -> error "ana_UNIT_DECL_DEFN"
fe216849cef7b87c6800aad21178d1e686575d8fChristian Maeder ParUnitSig _ _ -> return ((Map.insert un
0678d323bee844db79af13113ae252546629a594Christian Maeder (Based_par_unit_sig p usig) buc
0678d323bee844db79af13113ae252546629a594Christian Maeder , diag), dg', ud')
0678d323bee844db79af13113ae252546629a594Christian Maeder-- | Analyse unit imports
0678d323bee844db79af13113ae252546629a594Christian Maederana_UNIT_IMPORTED :: LogicGraph -> DGraph
0678d323bee844db79af13113ae252546629a594Christian Maeder -> HetcatsOpts -> ExtStUnitCtx -> Range -> [Annoted UNIT_TERM]
0678d323bee844db79af13113ae252546629a594Christian Maeder -> Result (MaybeDiagNode, Diag, DGraph, [Annoted UNIT_TERM])
0678d323bee844db79af13113ae252546629a594Christian Maederana_UNIT_IMPORTED lgraph dg opts uctx@(_, diag) poss terms =
0678d323bee844db79af13113ae252546629a594Christian Maeder case terms of
0678d323bee844db79af13113ae252546629a594Christian Maeder curl <- lookupCurrentLogic "UNIT_IMPORTED" lgraph
0678d323bee844db79af13113ae252546629a594Christian Maeder return (EmptyDiagNode curl, diag, dg, [])
0678d323bee844db79af13113ae252546629a594Christian Maeder (dnsigs, diag', dg', terms') <-
0678d323bee844db79af13113ae252546629a594Christian Maeder ana_UNIT_IMPORTED' lgraph dg opts uctx terms
0678d323bee844db79af13113ae252546629a594Christian Maeder (sig, dg'') <- nodeSigUnion lgraph dg'
0678d323bee844db79af13113ae252546629a594Christian Maeder (map (JustNode . getSigFromDiag) dnsigs) DGImports
0678d323bee844db79af13113ae252546629a594Christian Maeder -- check amalgamability conditions
0678d323bee844db79af13113ae252546629a594Christian Maeder {- let incl s = propagateErrors (ginclusion lgraph (getSig
0678d323bee844db79af13113ae252546629a594Christian Maeder (getSigFromDiag s)) (getSig sig)) -}
0678d323bee844db79af13113ae252546629a594Christian Maeder let pos = getPos_UNIT_IMPORTED poss
0678d323bee844db79af13113ae252546629a594Christian Maeder sink <- inclusionSink lgraph dnsigs sig
88ece6e49930670e8fd3ee79c89a2e918d2fbd0cChristian Maeder () <- assertAmalgamability opts pos diag' sink
0678d323bee844db79af13113ae252546629a594Christian Maeder (dnsig, diag'') <- extendDiagramIncl lgraph diag' dnsigs
f7d2e793728bbb7fd185e027eb9dfd7b9dd11c21Christian Maeder sig $ showDoc terms ""
0678d323bee844db79af13113ae252546629a594Christian Maeder return (JustDiagNode dnsig, diag'', dg'', terms')
0678d323bee844db79af13113ae252546629a594Christian Maederana_UNIT_IMPORTED' :: LogicGraph -> DGraph
0678d323bee844db79af13113ae252546629a594Christian Maeder -> HetcatsOpts -> ExtStUnitCtx -> [Annoted UNIT_TERM]
0678d323bee844db79af13113ae252546629a594Christian Maeder -> Result ([DiagNodeSig], Diag, DGraph, [Annoted UNIT_TERM])
0678d323bee844db79af13113ae252546629a594Christian Maederana_UNIT_IMPORTED' lgraph dg opts uctx@(buc, diag) ts = case ts of
0678d323bee844db79af13113ae252546629a594Christian Maeder [] -> return ([], diag, dg, [])
0678d323bee844db79af13113ae252546629a594Christian Maeder ut : uts -> do
0678d323bee844db79af13113ae252546629a594Christian Maeder (dnsig, diag', dg', ut') <-
0678d323bee844db79af13113ae252546629a594Christian Maeder ana_UNIT_TERM lgraph dg opts uctx (item ut)
0678d323bee844db79af13113ae252546629a594Christian Maeder (dnsigs, diag'', dg'', uts') <-
0678d323bee844db79af13113ae252546629a594Christian Maeder ana_UNIT_IMPORTED' lgraph dg' opts (buc, diag') uts
0678d323bee844db79af13113ae252546629a594Christian Maeder return (dnsig : dnsigs, diag'', dg'', (replaceAnnoted ut' ut) : uts')
0678d323bee844db79af13113ae252546629a594Christian Maeder-- | Analyse an unit expression
0678d323bee844db79af13113ae252546629a594Christian Maederana_UNIT_EXPRESSION :: LogicGraph -> DGraph
0678d323bee844db79af13113ae252546629a594Christian Maeder -> HetcatsOpts -> ExtStUnitCtx -> UNIT_EXPRESSION
0678d323bee844db79af13113ae252546629a594Christian Maeder -> Result (MaybeDiagNode, UnitSig, Diag, DGraph, UNIT_EXPRESSION)
0678d323bee844db79af13113ae252546629a594Christian Maederana_UNIT_EXPRESSION lgraph dg opts uctx@(buc, diag)
0678d323bee844db79af13113ae252546629a594Christian Maeder uexp@(Unit_expression ubs ut poss) = case ubs of
3ef9708a35cddb7ba66458ad4a065de549ce7db6Till Mossakowski (dnsig@(Diag_node_sig _ ns'), diag', dg', ut') <-
0678d323bee844db79af13113ae252546629a594Christian Maeder ana_UNIT_TERM lgraph dg opts uctx (item ut)
0678d323bee844db79af13113ae252546629a594Christian Maeder return (JustDiagNode dnsig, UnitSig ns', diag', dg',
0678d323bee844db79af13113ae252546629a594Christian Maeder Unit_expression [] (replaceAnnoted ut' ut) poss)
0678d323bee844db79af13113ae252546629a594Christian Maeder (args, dg', ubs') <-
0678d323bee844db79af13113ae252546629a594Christian Maeder ana_UNIT_BINDINGS lgraph dg opts uctx ubs
0678d323bee844db79af13113ae252546629a594Christian Maeder (resnsig, _dg'') <- nodeSigUnion lgraph dg'
0678d323bee844db79af13113ae252546629a594Christian Maeder (map (JustNode . snd) args) DGFormalParams
0678d323bee844db79af13113ae252546629a594Christian Maeder -- build the extended diagram and new based unit context
f7d2e793728bbb7fd185e027eb9dfd7b9dd11c21Christian Maeder let dexp = showDoc uexp ""
0678d323bee844db79af13113ae252546629a594Christian Maeder insNodes diag0 [] buc0 = return ([], diag0, buc0)
0678d323bee844db79af13113ae252546629a594Christian Maeder insNodes diag0 ((un, nsig) : args0) buc0 =
0678d323bee844db79af13113ae252546629a594Christian Maeder do (dnsig, diag') <- extendDiagramIncl lgraph diag0 []
Map.insert -}
let buc' = Map.insert un (Based_unit_sig dnsig) buc0
if Map.member un buc
(EmptyNode $ error "Static.AnalysisArchitecture")
case Map.lookup un buc of