@Options:
LANG = C;
@Global_define:
- @DeclareStruct:
- typedef struct tag_elem {
- call_id_t id;
- unsigned int data;
- } tag_elem_t;
-
@DeclareVar:
- spec_list *__queue;
- id_tag_t *tag;
+ IntegerList *__queue;
@InitVar:
- __queue = new_spec_list();
- tag = new_id_tag(); // Beginning of available id
- //@Cleanup:
- // if (__queue)
- // free_spec_list(__queue);
- // if (tag)
- // free_id_tag(tag);
- @DefineFunc:
- tag_elem_t* new_tag_elem(call_id_t id, unsigned int data) {
- tag_elem_t *e = (tag_elem_t*) CMODEL_MALLOC(sizeof(tag_elem_t));
- e->id = id;
- e->data = data;
- return e;
- }
- //@DefineFunc:
- // void free_tag_elem(tag_elem_t *e) {
- // free(e);
- // }
- @DefineFunc:
- call_id_t get_id(void *wrapper) {
- // if (wrapper == NULL)
- // return 0;
- // return ((tag_elem_t*) wrapper)->id;
- return wrapper == NULL ? 0 : ((tag_elem_t*) wrapper)->id;
- }
- @DefineFunc:
- unsigned int get_data(void *wrapper) {
- return ((tag_elem_t*) wrapper)->data;
- }
+ __queue = createIntegerList();
+ @Finalize:
+ if (__queue)
+ destroyIntegerList(__queue);
+ return true;
@Happens_before: Enqueue -> Dequeue
- # Only check the happens-before relationship according to the id of the
- # commit_point_set. For commit_point_set that has same ID, A -> B means
- # B happens after the previous A.
@Commutativity: Enqueue <-> Dequeue: true
- @Commutativity: Enqueue <-> Enqueue: _Method1.q != _Method2.q
- @Commutativity: Dequeue <-> Dequeue: _Method1.q != _Method2.q
+ @Commutativity: Dequeue <-> Dequeue: !_Method1.__RET__ || !_Method2.__RET__
+ //@Commutativity: Enqueue <-> Enqueue: _Method1.q != _Method2.q
+ //@Commutativity: Dequeue <-> Dequeue: _Method1.q != _Method2.q
@End
*/
@Begin
@Interface: Enqueue
@Commit_point_set: EnqueueUpdateNext
- @ID: get_and_inc(tag)
+ @ID: val
@Action:
# __ID__ is an internal macro that refers to the id of the current
# interface call
- tag_elem_t *elem = new_tag_elem(__ID__, val);
- push_back(__queue, elem);
- //model_print("Enqueue: input=%d\n", val);
+ push_back(__queue, val);
+ //model_print("Enqueue: val=%d\n", val);
@End
*/
void enqueue(queue_t *q, unsigned int val);
@Begin
@Interface: Dequeue
@Commit_point_set: DequeueReadHead | DequeueUpdateHead | DequeueReadNextVerify
- @ID: get_id(front(__queue))
+ @ID: __RET__ ? *retVal : 0
@Action:
- unsigned int _Old_Val = 0;
- if (size(__queue) > 0) {
- _Old_Val = get_data(front(__queue));
+ int elem = 0;
+ if (__RET__) {
+ elem = front(__queue);
pop_front(__queue);
}
- // model_print("Dequeue: __RET__=%d, retVal=%d, Old_Val=%d\n", __RET__, *retVal, _Old_Val);
- @Post_check: _Old_Val == 0 ? !__RET__ : _Old_Val == *retVal
+ //model_print("Dequeue: __RET__=%d, retVal=%d, elem=%d, \n", __RET__, *retVal, elem);
+ //model_print("Result: %d\n", __RET__ ? *retVal == elem : true);
+ @Post_check: __RET__ ? *retVal == elem : true
@End
*/
bool dequeue(queue_t *q, int *retVal);