From 267e1e92ecf87e302bf7809ebecb6dfbcee81de6 Mon Sep 17 00:00:00 2001 From: rschoene <rene.schoene@tu-dresden.de> Date: Tue, 3 May 2016 16:07:34 +0200 Subject: [PATCH] [WIP] ast-find-child with * to solve problems? --- Makefile | 2 +- ag-test.scm | 7 ++++++- ast-generation.scm | 13 +++++++------ basic-ag.scm | 15 +++++++++------ 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index c1d0121..dc55a9c 100644 --- a/Makefile +++ b/Makefile @@ -42,4 +42,4 @@ clean: rm -rf $(LARCENY_BUILD_DIR)/* run: racket - fab call_racket:cli.scm,ag | tee ast-output.txt | less + fab call_racket:cli.scm,ag 2>&1 | tee ast-output.txt | less diff --git a/ag-test.scm b/ag-test.scm index 2d98979..8a51952 100644 --- a/ag-test.scm +++ b/ag-test.scm @@ -14,6 +14,11 @@ ;; Testing printing whole asts ;; num-pe=10, num-pe-subs=0, num-comp=3, impl-per-comp=4, mode-per-impl=5 + (define (display-part2 node) + (define (print name) (cons name (lambda (v) v))) + (define printer (list (print 'remote-unit))) + (print-ast node printer (current-output-port))) + (define (do-it . args) (let* ([ast (create-system 10 0 3 4 5)] ; [clause (car (->* (->Clause* (car (->* (->Mode* (car (->* (->Impl* (car (->* (->Comp* (->SWRoot ast)))))))))))))] @@ -24,4 +29,4 @@ ; (display (=ilp-eval-binvar clause pe)) ; (rewrite-terminal 'value prov-clause (rand 1 3 0)) ; (display (=ilp-eval-binvar clause pe)) - (display-part ast)))) + (display-part2 ast)))) diff --git a/ast-generation.scm b/ast-generation.scm index d9aed73..0b62dd9 100644 --- a/ast-generation.scm +++ b/ast-generation.scm @@ -48,10 +48,11 @@ (let ([entry (assq nr types-al)]) (if entry (cdr entry) (let ([new (make-type nr container?)]) (set! types-al (cons (cons nr new) types-al)) new)))) (define (create-hw-clause udfs name property) - (let ([f (create-clause udfs default-hw-clause-gen name)]) - (if f (let ([args (f (->name property))]) - (if (eq? args #t) (set! args (default-hw-clause-gen (->name property)))) - (if args ((car args) property (cadr args) (caddr args)) #f)) + (let ([f (create-clause udfs default-hw-clause-gen name)] + [property-name (if (ast-subtype? property 'RealProperty) (->name property) (ast-child 'refname property))]) + (if f (let ([args (f property-name)]) + (if (eq? args #t) (set! args (default-hw-clause-gen property-name))) + (if args ((car args) property-name (cadr args) (caddr args)) #f)) #f))) (define (default-hw-clause-gen property-name) (cond @@ -137,13 +138,13 @@ (cons sw-root (car (prop last-comp-nr))))) (define (create-request target-property) - (let* ([make-req (lambda (p maxVal digits offset) (:ReqClause mquat-spec p comp-min-eq (rand maxVal digits offset)))] + (let* ([make-req (lambda (propname maxVal digits offset) (:ReqClause mquat-spec (:PropertyRef mquat-spec propname) comp-min-eq (rand maxVal digits offset)))] [target (<<- target-property)]) (debug "create-request: target-property = " target-property) (:Request mquat-spec (list (:MetaParameter mquat-spec mp-name ((rand 100 2 0)))) - target (list (make-req target-property 1 2 0)) #f))) ;TODO: check type of target-property (terminal?, Property?) + target (list (make-req (->name (=real target-property)) 1 2 0)) #f))) ;TODO: check type of target-property (terminal?, Property?) ; Creates a new system. ; num-pe: total number of resources diff --git a/basic-ag.scm b/basic-ag.scm index 5b4663e..469778d 100644 --- a/basic-ag.scm +++ b/basic-ag.scm @@ -64,7 +64,7 @@ (define (=value-attr n) (att-value 'value-attr n)) (define (=value-of n name) (att-value 'value-of n name)) - (define (find-prop propname subtree) (ast-find-child (lambda (i n) (string=? propname (->name n))) subtree)) + (define (find-prop propname subtree) (ast-find-child* (lambda (i n) (string=? propname (->name n))) subtree)) (define (add-basic-ags mquat-spec) (with-specification @@ -187,13 +187,13 @@ lookup-property (Root (lambda (n propname) (or (=lookup-property (->SWRoot n) propname) (=lookup-property (->HWRoot n) propname) (error "Could not find " propname)))) (SWRoot (lambda (n propname) (or (find-prop propname (->RealProperty* n)) - (ast-find-child (lambda (i c) (=lookup-property c propname)) (->Comp* n))))) + (ast-find-child* (lambda (i c) (=lookup-property c propname)) (->Comp* n))))) (Comp (lambda (n propname) (find-prop propname (->Property* n)))) - (HWRoot (lambda (n propname) (or (ast-find-child (lambda (i rt) (=lookup-property rt propname)) (->ResourceType* n)) - (ast-find-child (lambda (i r) (=lookup-property r propname)) (->SubResources n))))) + (HWRoot (lambda (n propname) (or (ast-find-child* (lambda (i rt) (=lookup-property rt propname)) (->ResourceType* n)) + (ast-find-child* (lambda (i r) (=lookup-property r propname)) (->SubResources n))))) (ResourceType (lambda (n propname) (find-prop propname (->RealProperty* n)))) (Resource (lambda (n propname) (or (find-prop propname (->Property* n)) - (ast-find-child (lambda (i sr) (=lookup-property sr propname)) (->SubResources n)))))) + (ast-find-child* (lambda (i sr) (=lookup-property sr propname)) (->SubResources n)))))) ; <=impl: Get Impl in subtree of the Impl (ag-rule get-impl (Impl (lambda (n) n))) @@ -253,7 +253,7 @@ (ag-rule real (RealProperty (lambda (n) n)) - (PropertyRef (lambda (n) (info n ", refname=" (ast-child 'refname n) ", hasParent=" (ast-has-parent? n)) (=real (=lookup-property (<=root n) (ast-child 'refname n)))))) + (PropertyRef (lambda (n) (debug n ", refname=" (ast-child 'refname n) ", hasParent=" (ast-has-parent? n)) (=lookup-property (<=root n) (ast-child 'refname n))))) ; =req-comp-map: Returns a associate list, mapping required components to a list of implementations requiring that component (ag-rule @@ -315,6 +315,9 @@ ; =selected?: Returns #t, if the Implementation is selected by its component (ag-rule selected? (Impl (lambda (n) (eq? (->selected-impl (<<- n)) n)))) + ; =remote-unit: Returns the unit of the RealProperty the PropertyRef is pointing to + (ag-rule remote-unit (PropertyRef (lambda (n) (->unit (=real n))))) + ; =value-of: Given a metaparameter name, return the value of the according metaparameter (ag-rule value-of (Request (lambda (n name) (ast-find-child* (lambda (i child) (and (string=? (->name child) name) (->value child))) -- GitLab