roles: TUPLE: -> ROLES-TUPLE: for now

db4
Doug Coleman 2015-07-21 16:02:51 -07:00
parent af3605bfe6
commit 429ecc9811
4 changed files with 126 additions and 128 deletions

View File

@ -1,7 +1,6 @@
! (c)2010 Joe Groff bsd license
USING: accessors arrays combinators io io.streams.string kernel
math math.parser roles sequences strings variants words ;
FROM: roles => TUPLE: ;
IN: cuda.ptx
UNION: dim integer sequence ;
@ -33,21 +32,21 @@ VARIANT: ptx-storage-space
.shared
.tex ;
TUPLE: ptx-target
ROLE-TUPLE: ptx-target
{ arch maybe{ ptx-arch } }
{ map_f64_to_f32? boolean }
{ texmode maybe{ ptx-texmode } } ;
TUPLE: ptx
ROLE-TUPLE: ptx
{ version string }
{ target ptx-target }
body ;
TUPLE: ptx-struct-definition
ROLE-TUPLE: ptx-struct-definition
{ name string }
members ;
TUPLE: ptx-variable
ROLE-TUPLE: ptx-variable
{ extern? boolean }
{ visible? boolean }
{ align maybe{ integer } }
@ -58,54 +57,54 @@ TUPLE: ptx-variable
{ dim dim }
{ initializer maybe{ string } } ;
TUPLE: ptx-negation
ROLE-TUPLE: ptx-negation
{ var string } ;
TUPLE: ptx-vector
ROLE-TUPLE: ptx-vector
elements ;
TUPLE: ptx-element
ROLE-TUPLE: ptx-element
{ var string }
{ index integer } ;
UNION: ptx-var
string ptx-element ;
TUPLE: ptx-indirect
ROLE-TUPLE: ptx-indirect
{ base ptx-var }
{ offset integer } ;
UNION: ptx-operand
integer float ptx-var ptx-negation ptx-vector ptx-indirect ;
TUPLE: ptx-instruction
ROLE-TUPLE: ptx-instruction
{ label maybe{ string } }
{ predicate maybe{ ptx-operand } } ;
TUPLE: ptx-entry
ROLE-TUPLE: ptx-entry
{ name string }
params
directives
body ;
TUPLE: ptx-func < ptx-entry
ROLE-TUPLE: ptx-func < ptx-entry
{ return maybe{ ptx-variable } } ;
TUPLE: ptx-directive ;
ROLE-TUPLE: ptx-directive ;
TUPLE: .file < ptx-directive
ROLE-TUPLE: .file < ptx-directive
{ info string } ;
TUPLE: .loc < ptx-directive
ROLE-TUPLE: .loc < ptx-directive
{ info string } ;
TUPLE: .maxnctapersm < ptx-directive
ROLE-TUPLE: .maxnctapersm < ptx-directive
{ ncta integer } ;
TUPLE: .minnctapersm < ptx-directive
ROLE-TUPLE: .minnctapersm < ptx-directive
{ ncta integer } ;
TUPLE: .maxnreg < ptx-directive
ROLE-TUPLE: .maxnreg < ptx-directive
{ n integer } ;
TUPLE: .maxntid < ptx-directive
ROLE-TUPLE: .maxntid < ptx-directive
{ dim dim } ;
TUPLE: .pragma < ptx-directive
ROLE-TUPLE: .pragma < ptx-directive
{ pragma string } ;
VARIANT: ptx-float-rounding-mode
@ -116,39 +115,39 @@ VARIANT: ptx-int-rounding-mode
UNION: ptx-rounding-mode
ptx-float-rounding-mode ptx-int-rounding-mode ;
TUPLE: ptx-typed-instruction < ptx-instruction
ROLE-TUPLE: ptx-typed-instruction < ptx-instruction
{ type ptx-type }
{ dest ptx-operand } ;
TUPLE: ptx-2op-instruction < ptx-typed-instruction
ROLE-TUPLE: ptx-2op-instruction < ptx-typed-instruction
{ a ptx-operand } ;
TUPLE: ptx-3op-instruction < ptx-typed-instruction
ROLE-TUPLE: ptx-3op-instruction < ptx-typed-instruction
{ a ptx-operand }
{ b ptx-operand } ;
TUPLE: ptx-4op-instruction < ptx-typed-instruction
ROLE-TUPLE: ptx-4op-instruction < ptx-typed-instruction
{ a ptx-operand }
{ b ptx-operand }
{ c ptx-operand } ;
TUPLE: ptx-5op-instruction < ptx-typed-instruction
ROLE-TUPLE: ptx-5op-instruction < ptx-typed-instruction
{ a ptx-operand }
{ b ptx-operand }
{ c ptx-operand }
{ d ptx-operand } ;
TUPLE: ptx-addsub-instruction < ptx-3op-instruction
ROLE-TUPLE: ptx-addsub-instruction < ptx-3op-instruction
{ sat? boolean }
{ cc? boolean } ;
VARIANT: ptx-mul-mode
.wide ;
TUPLE: ptx-mul-instruction < ptx-3op-instruction
ROLE-TUPLE: ptx-mul-instruction < ptx-3op-instruction
{ mode maybe{ ptx-mul-mode } } ;
TUPLE: ptx-mad-instruction < ptx-4op-instruction
ROLE-TUPLE: ptx-mad-instruction < ptx-4op-instruction
{ mode maybe{ ptx-mul-mode } }
{ sat? boolean } ;
@ -181,7 +180,7 @@ INSTANCE: .lo ptx-cmp-op
INSTANCE: .hi ptx-mul-mode
INSTANCE: .hi ptx-cmp-op
TUPLE: ptx-set-instruction < ptx-3op-instruction
ROLE-TUPLE: ptx-set-instruction < ptx-3op-instruction
{ cmp-op ptx-cmp-op }
{ bool-op maybe{ ptx-op } }
{ c maybe{ ptx-operand } }
@ -191,7 +190,7 @@ VARIANT: ptx-cache-op
.ca .cg .cs .lu .cv
.wb .wt ;
TUPLE: ptx-ldst-instruction < ptx-2op-instruction
ROLE-TUPLE: ptx-ldst-instruction < ptx-2op-instruction
{ volatile? boolean }
{ storage-space maybe{ ptx-storage-space } }
{ cache-op maybe{ ptx-cache-op } } ;
@ -199,7 +198,7 @@ TUPLE: ptx-ldst-instruction < ptx-2op-instruction
VARIANT: ptx-cache-level
.L1 .L2 ;
TUPLE: ptx-branch-instruction < ptx-instruction
ROLE-TUPLE: ptx-branch-instruction < ptx-instruction
{ target string }
{ uni? boolean } ;
@ -209,127 +208,127 @@ VARIANT: ptx-membar-level
VARIANT: ptx-vote-mode
.all .any .uni .ballot ;
TUPLE: ptx-instruction-not-supported-yet < ptx-instruction ;
ROLE-TUPLE: ptx-instruction-not-supported-yet < ptx-instruction ;
TUPLE: abs <{ ptx-2op-instruction ptx-float-ftz } ;
TUPLE: add <{ ptx-addsub-instruction ptx-float-env } ;
TUPLE: addc < ptx-addsub-instruction ;
TUPLE: and < ptx-3op-instruction ;
TUPLE: atom < ptx-3op-instruction
ROLE-TUPLE: abs <{ ptx-2op-instruction ptx-float-ftz } ;
ROLE-TUPLE: add <{ ptx-addsub-instruction ptx-float-env } ;
ROLE-TUPLE: addc < ptx-addsub-instruction ;
ROLE-TUPLE: and < ptx-3op-instruction ;
ROLE-TUPLE: atom < ptx-3op-instruction
{ storage-space maybe{ ptx-storage-space } }
{ op ptx-op }
{ c maybe{ ptx-operand } } ;
TUPLE: bar.arrive < ptx-instruction
ROLE-TUPLE: bar.arrive < ptx-instruction
{ a ptx-operand }
{ b ptx-operand } ;
TUPLE: bar.red < ptx-2op-instruction
ROLE-TUPLE: bar.red < ptx-2op-instruction
{ op ptx-op }
{ b maybe{ ptx-operand } }
{ c ptx-operand } ;
TUPLE: bar.sync < ptx-instruction
ROLE-TUPLE: bar.sync < ptx-instruction
{ a ptx-operand }
{ b maybe{ ptx-operand } } ;
TUPLE: bfe < ptx-4op-instruction ;
TUPLE: bfi < ptx-5op-instruction ;
TUPLE: bfind < ptx-2op-instruction
ROLE-TUPLE: bfe < ptx-4op-instruction ;
ROLE-TUPLE: bfi < ptx-5op-instruction ;
ROLE-TUPLE: bfind < ptx-2op-instruction
{ shiftamt? boolean } ;
TUPLE: bra < ptx-branch-instruction ;
TUPLE: brev < ptx-2op-instruction ;
TUPLE: brkpt < ptx-instruction ;
TUPLE: call < ptx-branch-instruction
ROLE-TUPLE: bra < ptx-branch-instruction ;
ROLE-TUPLE: brev < ptx-2op-instruction ;
ROLE-TUPLE: brkpt < ptx-instruction ;
ROLE-TUPLE: call < ptx-branch-instruction
{ return maybe{ ptx-operand } }
params ;
TUPLE: clz < ptx-2op-instruction ;
TUPLE: cnot < ptx-2op-instruction ;
TUPLE: copysign < ptx-3op-instruction ;
TUPLE: cos <{ ptx-2op-instruction ptx-float-env } ;
TUPLE: cvt < ptx-2op-instruction
ROLE-TUPLE: clz < ptx-2op-instruction ;
ROLE-TUPLE: cnot < ptx-2op-instruction ;
ROLE-TUPLE: copysign < ptx-3op-instruction ;
ROLE-TUPLE: cos <{ ptx-2op-instruction ptx-float-env } ;
ROLE-TUPLE: cvt < ptx-2op-instruction
{ round maybe{ ptx-rounding-mode } }
{ ftz? boolean }
{ sat? boolean }
{ dest-type ptx-type } ;
TUPLE: cvta < ptx-2op-instruction
ROLE-TUPLE: cvta < ptx-2op-instruction
{ to? boolean }
{ storage-space maybe{ ptx-storage-space } } ;
TUPLE: div <{ ptx-3op-instruction ptx-float-env } ;
TUPLE: ex2 <{ ptx-2op-instruction ptx-float-env } ;
TUPLE: exit < ptx-instruction ;
TUPLE: fma <{ ptx-mad-instruction ptx-float-env } ;
TUPLE: isspacep < ptx-instruction
ROLE-TUPLE: div <{ ptx-3op-instruction ptx-float-env } ;
ROLE-TUPLE: ex2 <{ ptx-2op-instruction ptx-float-env } ;
ROLE-TUPLE: exit < ptx-instruction ;
ROLE-TUPLE: fma <{ ptx-mad-instruction ptx-float-env } ;
ROLE-TUPLE: isspacep < ptx-instruction
{ storage-space ptx-storage-space }
{ dest ptx-operand }
{ a ptx-operand } ;
TUPLE: ld < ptx-ldst-instruction ;
TUPLE: ldu < ptx-ldst-instruction ;
TUPLE: lg2 <{ ptx-2op-instruction ptx-float-env } ;
TUPLE: mad <{ ptx-mad-instruction ptx-float-env } ;
TUPLE: mad24 < ptx-mad-instruction ;
TUPLE: max <{ ptx-3op-instruction ptx-float-ftz } ;
TUPLE: membar < ptx-instruction
ROLE-TUPLE: ld < ptx-ldst-instruction ;
ROLE-TUPLE: ldu < ptx-ldst-instruction ;
ROLE-TUPLE: lg2 <{ ptx-2op-instruction ptx-float-env } ;
ROLE-TUPLE: mad <{ ptx-mad-instruction ptx-float-env } ;
ROLE-TUPLE: mad24 < ptx-mad-instruction ;
ROLE-TUPLE: max <{ ptx-3op-instruction ptx-float-ftz } ;
ROLE-TUPLE: membar < ptx-instruction
{ level ptx-membar-level } ;
TUPLE: min <{ ptx-3op-instruction ptx-float-ftz } ;
TUPLE: mov < ptx-2op-instruction ;
TUPLE: mul <{ ptx-mul-instruction ptx-float-env } ;
TUPLE: mul24 < ptx-mul-instruction ;
TUPLE: neg <{ ptx-2op-instruction ptx-float-ftz } ;
TUPLE: not < ptx-2op-instruction ;
TUPLE: or < ptx-3op-instruction ;
TUPLE: pmevent < ptx-instruction
ROLE-TUPLE: min <{ ptx-3op-instruction ptx-float-ftz } ;
ROLE-TUPLE: mov < ptx-2op-instruction ;
ROLE-TUPLE: mul <{ ptx-mul-instruction ptx-float-env } ;
ROLE-TUPLE: mul24 < ptx-mul-instruction ;
ROLE-TUPLE: neg <{ ptx-2op-instruction ptx-float-ftz } ;
ROLE-TUPLE: not < ptx-2op-instruction ;
ROLE-TUPLE: or < ptx-3op-instruction ;
ROLE-TUPLE: pmevent < ptx-instruction
{ a ptx-operand } ;
TUPLE: popc < ptx-2op-instruction ;
TUPLE: prefetch < ptx-instruction
ROLE-TUPLE: popc < ptx-2op-instruction ;
ROLE-TUPLE: prefetch < ptx-instruction
{ a ptx-operand }
{ storage-space maybe{ ptx-storage-space } }
{ level ptx-cache-level } ;
TUPLE: prefetchu < ptx-instruction
ROLE-TUPLE: prefetchu < ptx-instruction
{ a ptx-operand }
{ level ptx-cache-level } ;
TUPLE: prmt < ptx-4op-instruction
ROLE-TUPLE: prmt < ptx-4op-instruction
{ mode maybe{ ptx-prmt-mode } } ;
TUPLE: rcp <{ ptx-2op-instruction ptx-float-env } ;
TUPLE: red < ptx-2op-instruction
ROLE-TUPLE: rcp <{ ptx-2op-instruction ptx-float-env } ;
ROLE-TUPLE: red < ptx-2op-instruction
{ storage-space maybe{ ptx-storage-space } }
{ op ptx-op } ;
TUPLE: rem < ptx-3op-instruction ;
TUPLE: ret < ptx-instruction ;
TUPLE: rsqrt <{ ptx-2op-instruction ptx-float-env } ;
TUPLE: sad < ptx-4op-instruction ;
TUPLE: selp < ptx-4op-instruction ;
TUPLE: set < ptx-set-instruction
ROLE-TUPLE: rem < ptx-3op-instruction ;
ROLE-TUPLE: ret < ptx-instruction ;
ROLE-TUPLE: rsqrt <{ ptx-2op-instruction ptx-float-env } ;
ROLE-TUPLE: sad < ptx-4op-instruction ;
ROLE-TUPLE: selp < ptx-4op-instruction ;
ROLE-TUPLE: set < ptx-set-instruction
{ dest-type ptx-type } ;
TUPLE: setp < ptx-set-instruction
ROLE-TUPLE: setp < ptx-set-instruction
{ |dest maybe{ ptx-operand } } ;
TUPLE: shl < ptx-3op-instruction ;
TUPLE: shr < ptx-3op-instruction ;
TUPLE: sin <{ ptx-2op-instruction ptx-float-env } ;
TUPLE: slct < ptx-4op-instruction
ROLE-TUPLE: shl < ptx-3op-instruction ;
ROLE-TUPLE: shr < ptx-3op-instruction ;
ROLE-TUPLE: sin <{ ptx-2op-instruction ptx-float-env } ;
ROLE-TUPLE: slct < ptx-4op-instruction
{ dest-type ptx-type }
{ ftz? boolean } ;
TUPLE: sqrt <{ ptx-2op-instruction ptx-float-env } ;
TUPLE: st < ptx-ldst-instruction ;
TUPLE: sub <{ ptx-addsub-instruction ptx-float-env } ;
TUPLE: subc < ptx-addsub-instruction ;
TUPLE: suld < ptx-instruction-not-supported-yet ;
TUPLE: sured < ptx-instruction-not-supported-yet ;
TUPLE: sust < ptx-instruction-not-supported-yet ;
TUPLE: suq < ptx-instruction-not-supported-yet ;
TUPLE: testp < ptx-2op-instruction
ROLE-TUPLE: sqrt <{ ptx-2op-instruction ptx-float-env } ;
ROLE-TUPLE: st < ptx-ldst-instruction ;
ROLE-TUPLE: sub <{ ptx-addsub-instruction ptx-float-env } ;
ROLE-TUPLE: subc < ptx-addsub-instruction ;
ROLE-TUPLE: suld < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: sured < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: sust < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: suq < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: testp < ptx-2op-instruction
{ op ptx-testp-op } ;
TUPLE: tex < ptx-instruction-not-supported-yet ;
TUPLE: txq < ptx-instruction-not-supported-yet ;
TUPLE: trap < ptx-instruction ;
TUPLE: vabsdiff < ptx-instruction-not-supported-yet ;
TUPLE: vadd < ptx-instruction-not-supported-yet ;
TUPLE: vmad < ptx-instruction-not-supported-yet ;
TUPLE: vmax < ptx-instruction-not-supported-yet ;
TUPLE: vmin < ptx-instruction-not-supported-yet ;
TUPLE: vset < ptx-instruction-not-supported-yet ;
TUPLE: vshl < ptx-instruction-not-supported-yet ;
TUPLE: vshr < ptx-instruction-not-supported-yet ;
TUPLE: vsub < ptx-instruction-not-supported-yet ;
TUPLE: vote < ptx-2op-instruction
ROLE-TUPLE: tex < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: txq < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: trap < ptx-instruction ;
ROLE-TUPLE: vabsdiff < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: vadd < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: vmad < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: vmax < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: vmin < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: vset < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: vshl < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: vshr < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: vsub < ptx-instruction-not-supported-yet ;
ROLE-TUPLE: vote < ptx-2op-instruction
{ mode ptx-vote-mode } ;
TUPLE: xor < ptx-3op-instruction ;
ROLE-TUPLE: xor < ptx-3op-instruction ;
GENERIC: ptx-element-label ( elt -- label )
M: object ptx-element-label drop f ;

View File

@ -16,10 +16,10 @@ $nl
}
"Slot attributes are lists of slot attribute specifiers followed by values; a slot attribute specifier is one of " { $link initial: } " or " { $link read-only } ". See " { $link "tuple-declarations" } " for details." } ;
HELP: TUPLE:
{ $syntax """TUPLE: name slots ;
TUPLE: name < estate slots ;
TUPLE: name <{ estates... } slots... ;""" }
HELP: ROLE-TUPLE:
{ $syntax """ROLE-TUPLE: name slots ;
ROLE-TUPLE: name < estate slots ;
ROLE-TUPLE: name <{ estates... } slots... ;""" }
{ $description "Defines a new " { $link tuple } " class."
$nl
"The list of inherited " { $snippet "estates" } " is optional; a single tuple superclass and/or a set of " { $link role } "s can be specified. If no superclass is provided, it defaults to " { $link tuple } "."
@ -34,26 +34,26 @@ $nl
{
POSTPONE: ROLE:
POSTPONE: TUPLE:
POSTPONE: ROLE-TUPLE:
} related-words
HELP: role
{ $class-description "The superclass of all role classes. A " { $snippet "role" } " is a " { $link mixin-class } " that includes a set of slot definitions that can be added to " { $link tuple } " classes alongside other " { $snippet "role" } "s." } ;
HELP: multiple-inheritance-attempted
{ $class-description "This error is thrown if a " { $link POSTPONE: TUPLE: } " definition attempts to inherit more than one " { $link tuple } " class." } ;
{ $class-description "This error is thrown if a " { $link POSTPONE: ROLE-TUPLE: } " definition attempts to inherit more than one " { $link tuple } " class." } ;
HELP: role-slot-overlap
{ $class-description "This error is thrown if a " { $link POSTPONE: TUPLE: } " or " { $link POSTPONE: ROLE: } " definition attempts to inherit a set of " { $link role } "s in which more than one attempts to define the same slot." } ;
{ $class-description "This error is thrown if a " { $link POSTPONE: ROLE-TUPLE: } " or " { $link POSTPONE: ROLE: } " definition attempts to inherit a set of " { $link role } "s in which more than one attempts to define the same slot." } ;
ARTICLE: "roles" "Roles"
"The " { $vocab-link "roles" } " vocabulary provides a form of tuple interface that can be implemented by concrete tuple classes. A " { $link role } " definition is a mixin class that also prescribes a set of tuple slots. Roles are not tuple classes by themselves and cannot be instantiated by " { $link new } ". The vocabulary extends " { $link POSTPONE: TUPLE: } " syntax to allow concrete tuple types to declare membership to one or more roles, automatically including their prescribed slots." $nl
"The " { $vocab-link "roles" } " vocabulary provides a form of tuple interface that can be implemented by concrete tuple classes. A " { $link role } " definition is a mixin class that also prescribes a set of tuple slots. Roles are not tuple classes by themselves and cannot be instantiated by " { $link new } ". The vocabulary extends " { $link POSTPONE: ROLE-TUPLE: } " syntax to allow concrete tuple types to declare membership to one or more roles, automatically including their prescribed slots." $nl
"The role superclass:"
{ $subsections role }
"Syntax for making a new role:"
{ $subsection POSTPONE: ROLE: }
"Syntax for making tuples that use roles:"
{ $subsection POSTPONE: TUPLE: }
{ $subsection POSTPONE: ROLE-TUPLE: }
"Errors with roles:"
{ $subsections multiple-inheritance-attempted role-slot-overlap } ;

View File

@ -1,7 +1,6 @@
! (c)2009 Joe Groff bsd license
USING: accessors classes.tuple compiler.units kernel qw roles sequences
tools.test ;
FROM: roles => TUPLE: ;
IN: roles.tests
ROLE: fork tines ;
@ -9,11 +8,11 @@ ROLE: spoon bowl ;
ROLE: instrument tone ;
ROLE: tuning-fork <{ fork instrument } volume ;
TUPLE: utensil handle ;
ROLE-TUPLE: utensil handle ;
! role consumption and tuple inheritance can be mixed
TUPLE: foon <{ utensil fork spoon } ;
TUPLE: tuning-spork <{ utensil spoon tuning-fork } ;
ROLE-TUPLE: foon <{ utensil fork spoon } ;
ROLE-TUPLE: tuning-spork <{ utensil spoon tuning-fork } ;
! role class testing
{ t } [ fork role? ] unit-test
@ -49,7 +48,7 @@ SYMBOL: spong
[ role-slot-overlap? ] must-fail-with
! can't try to inherit multiple tuple classes
TUPLE: tool blade ;
ROLE-TUPLE: tool blade ;
SYMBOL: knife
[ knife { utensil tool } { } define-tuple-class-with-roles ]

View File

@ -65,4 +65,4 @@ PREDICATE: role < mixin-class
[ drop [ role? ] filter add-to-roles ] 3tri ;
SYNTAX: ROLE: parse-role-definition define-role ;
SYNTAX: TUPLE: parse-role-definition define-tuple-class-with-roles ;
SYNTAX: ROLE-TUPLE: parse-role-definition define-tuple-class-with-roles ;